加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

字符串指针作函数参数zz

(2009-01-08 12:23:44)
标签:

it

将一个字符串从一个函数传递到另一个函数,可以使用传地址的方式,即用字符数组名或字符指针变量作参数。有以下四种情况:

  实参 形参
1 数组名 数组名
2 数组名 字符指针变量
3 字符指针变量 字符指针变量
4 字符指针变量 数组名

[例] 用函数调用实现字符串的复制。

(1)用字符数组作参数。

void copy_string(char from[], char to[])
{ int i=0;
  while(from[i] != '\0')
  { to[i] = from[i]; i++; }
  to[i] = '\0';
}  
   
main ()
{ char a[] = "I am a teacher.";
  char b[] = "you are a student.";
  printf("string_a =%s\n string_b =%s\n", a,b);
  copy_string(a,b);
  printf("string_a =%s\n string_b =%s\n", a,b);
}  

main()函数可以改写为(使用字符指针):

main ()
{ char *a = "I am a teacher.";
  char *b = "you are a student.";
  printf("string_a =%s\n string_b =%s\n", a,b);
  copy_string(a,b);
  printf("string_a =%s\n string_b =%s\n", a,b);
}  

(2)形参用字符指针。

void (char *from, char *to)
{  
  for(; *form != '\0'; from++, to++)
     *to = *from;
  *to = '\0';
}  
   
main ()
{ char *a = "I am a teacher.";
  char *b = "you are a student.";
  printf("string_a =%s\n string_b =%s\n", a,b);
  copy_string(a,b);
  printf("string_a =%s\n string_b =%s\n", a,b);
}  

(3)对copy_string函数的几种简化

void copy_string(char *from, char *to)
{
 while((*to=*from) !='\0')
   {to++; from++}
}

*to=*from是一个赋值表达式,其值等于*from。to++和from++分别使指针指向下一个字节。

先执行赋值表达式,再判赋值表达式的值(等于*from)是否为'\0',因此,from串中的结尾字符'\0'被赋值给to。

void copy_string(char *from, char *to)
{  
  while((*to++=*from++) != '\0');
}  

*to++=*from++先执行*to=*from,再使to、from分别加1。

void copy_string(char *from, char *to)
{  
  while(*from != '\0')
  *to++ = *from++;
  *to = '\0';
}  

当遇到*from='\0'时,不执行赋值运算*to++=*from++,因此,最后应加一句*to='\0'。

void copy_string(char *from, char *to)
{  
  while(*to++=*from++);
}  

与第②种简化相同,当*from='\0'时,表达式*to++=*from++的值等于'\0'(假),结束while循环。

void copy_string(char *from, char *to)
{  
  for(;(*to++ =*from++) !=0;);
for(;*to++ =*from++;);
}  

⑤ for循环的结束条件是表达式*to++ =*from++的值(即*from的值)等于'\0'。且form中的'\0'已被赋给to。注意'\0'的ASCII码是不是0。

void copy_string(char from[], char to[])
{ char *p1, *p2;
  p1 = from; p2 = to;
  while((*p2++=p1++) !='\0')
}  

形参用数组,使用局部指针变量指向形参数组。

 

 

(4).字符串指针作函数的参数

字符串指针作函数的参数,与前面介绍的数组指针作函数参数没有本质的区别,函数间传递的都是地址值,所不同的仅是指针指向对象的类型不同而已。

5 用字符串指针作函数参数,将输入的一个字符串复制到另一个字符串中(重点例题)

#include "stdio.h"

main()

{

 void copy_s(char *,char *);   

 char a[20],b[30];

 gets(a);                   

 copy_s(a,b);               

 puts(b);                   

}

 

void copy_s(char *str1,char *str2)

{

 while((*str2=*str1)!='\0')

    {

     str1++;

     str2++;

    }

}

程序在主函数中定义了两个字符数组a和b,a数组由gets()函数获得,b数组通过调用copy_s()函数自动生成。copy_s()函数有两个指向字符串的形参,其功能是将str1指向的字符串复制到str2中。

copy_s()函数体由一个while语句构成,其条件表达式“(*str2=* str 1)!='\0'”的计算过程是:先进行赋值*str2=*str1,将指针str1的内容送到指针str2指向的存储位置,然后再判断所赋值的字符是否是串结束标记'\0'。若条件表达式成立,即当前复制的字符不是串结束标记,则继续循环,复制下一个字符;否则,退出循环,完成串复制。

在主函数中调用copy_s()函数时,必须注意两个实参地址的顺序,第一个实参是原始字符串首地址,第二个实参是目标字符串首地址。本程序调用时使用的是存储两个字符串的字符数组名。当然,在函数调用时,也可以直接使用字符串指针变量作函数实参,如下是修改后的main()函数:

main()

{

 void copy_s(char *,char *);

 char a[20],b[30],*pa=a,*pb=b; 

 gets(pa);      

 copy_s(pa,pb);              

 puts(pb);                   

}

事实上,这种使用字符串的方法在C语言程序中更为常用。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有