将一个字符串从一个函数传递到另一个函数,可以使用传地址的方式,即用字符数组名或字符指针变量作参数。有以下四种情况:
| 实参 | 形参 | 1 | 数组名 | 数组名 | 2 | 数组名 | 字符指针变量 | 3 | 字符指针变量 | 字符指针变量 | 4 | 字符指针变量 | 数组名 |
[例] 用函数调用实现字符串的复制。
(1)用字符数组作参数。
void | copy_string(char from[], char to[]) | { | int i=0; | | while(from != '\0') | | { to = from; i++; } | | 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); | } | |
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语言程序中更为常用。
|