11.4 自定义输入/输出函数
不一定非要使用C库中的标准函数,如果无法使用这些函数或者不想用它们,完全可以在getchar()和putchar()的基础上自定义所需的函数。
类似puts()但是不会自动添加换行符的函数。
程序清单 11.14 put1()函数
/* put1.c -- 打印字符串,不添加\n */
#include
void put1( const char *string ) /*不会改变字符串*/
{
while( *string != '\0' ){
putchar( *string++ );
}
}
*运算符要从右往左计算。
可以把put1.c程序作为编写字符串处理函数的模型。因为每个字符串都以空字符结尾,所以不用给函数传递字符串大小。函数依次处理每个字符,直至遇到空字符。
用数组表示法编写这个函数稍微复杂些:
int i = 0;
while( string[i] != '\0' ){
putchar( string[i++] );
}
要为数组索引创建一个额外的变量。
许多C程序员会在while循环中使用下面的测试条件:
while( *string )
当string指向空字符时,*string的值是0,即测试条件为假,while循环结束。这种方法比上面两种方法简洁。这种处理方法在C语言中很普遍,作为C程序员应该熟悉这种写法。
注意
为什么put1.c中的形式参数是const char *string,而不是const char string[]?从技术方面看,两者等价都有效。使用方括号是为了提醒用户,该函数处理的是数组。然而,如果要处理字符串、实际参数可以是数组名、用双引号括起来的字符串,或声明为char *类型的变量。用const char *string可以提醒用户:实际参数不一定是数组。
设计一个类似puts()的函数,而且该函数还给出待打印字符的个数。
程序清单11.15 put2.c程序
/*put2.c --- 打印一个字符串,并统计打印的字符数*/
#include
int put2( const char *string ){
int count = 0;
while( *string ){
putchar( *string++ );
count++;
}
putchar( '\n' ); /*不统计换行符*/
return (count);
}
简单的驱动程序测试put1()和put2(),并演示了嵌套函数的调用
//put_put.c -- user-defined output functions
#include
void put1(const char *);
int put2(const char *);
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) /* same as *string != '\0' */
putchar(*string++);
}
int put2(const char * string)
{
int count = 0;
while (*string)
{
putchar(*string++);
count++;
}
putchar('\n');
return(count);
}
/* 输出:
*/
为了获得put2()的返回值,计算机必须先执行put2(),因此在打印字符数之前先打印了传递给该函数的字符串。