不必定要使用标准C库的函数进行输入和输出。若是不具有或者不喜欢它们,您能够自行定义,在getchar() putchar()的基础上创建本身的函数。程序员
假定您但愿有一个相似puts()但并不自动添加换行符的函数。程序清单11.10给出了一种方法。数组
程序清单11.10 put1.c程序函数
/*put1.c 不添加换行符打印一个字符串*/ #include <stdio.h> void put1(const char *string) /*不会改变这个字符串*/ { while(*string !='\0') putchar(*string++); }
char指针string最初指向被调参数的第一个元素。因为这个函数并不改变字符串,所以使用了const修饰符。这一元素的内容输出之后,指针递增并指向下一个元素。这个过程一直继续下去,直到指针指向一个包含空字符的元素。记住,++比*的优先级高,这意味着putchar(*string++)输出string指向的值,而后再增长string自己,而不是增长stirng指向的字符。指针
能够把put1.c看做自定义字符串处理函数的范例。每一个字符串都有一个空字符标志其结束,所以没必要向函数传递字符串的大小。相反,函数依次处理每一个字符直到遇到空字符。code
用数组符号写这个函数会比较长:索引
int i = 0; while(string[i]!='\0') putchar(string[i++]);
其中用到了一个做为索引的额外变量。字符串
不少C程序员会在while循环中使用下面的判断条件:get
while (*string)
当string指向空字符时,*string的值0,这将结束循环。上面的语句被普遍使用。字符串处理
**说明 为何程序清单11.10用const char *string而不用const char string[]做为形式参数?从技术上来讲,两者等价,所以它们都有效。用方括号符号的一个用意 是提醒用户这个函数处理的是数组。但在使用字符串时,实际的参数能够是数组名、引发来的字符串,或被声明为char*类型的变量。使用const char *string能够提醒您实际的参数不必定是一个数组。string
假定您但愿有一个相似puts()的函数,而且这个函数还能够给出输出的字符个数。如程序清单11.11所示,添加这一功能很简单。
程序清单 11.11 put2.c程序
/*put2.c 打印一个字符串,并统计其中的字符个数*/ #include <stdio.h> int put2(const char *string) /*不会改变这个字符串*/ { int count=0; while(*sting) { putchar(*string++); count++; } putchar('\n'); return (count); }
下面的调用输出字符串pizza:
put2("pizza");
下面的调用还返回一个字符计数值,并把该值赋给num。在本例中这个值是5。
num=put2("pizza") ;
程序清单11.12 给出了一个使用put1()和put2()的驱动程序,其中还使用了嵌套的函数调用。
程序清单11.12 put_put.c 程序
/*put2.c 打印一个字符串,并统计其中的字符个数*/ #include <stdio.h> void put1(const char *string); int put2(const char *string); /*不会改变这个字符串*/ int main(void) { put1("If I'd as much money"); put1(" as I could spend, \n"); printf("I count %d characters.\n", put2("I never would cry old chairs to mend. ")); return 0; } void put1(const char *string) { while(*string) putchar(*string++); } int put2(const char *string) { int count=0; while(*string) { putchar(*string++); count++; } putchar('\n'); return (count); }
咱们使用printf()输出put2()的值。可是在计算put2()的过程当中,计算机必须先执行这个函数,这样就输出了其中的字符串。
If I'd as much money as I could spend, I never would cry old chairs to mend. I count 38 characters.