当前位置:嗨网首页>书籍在线阅读

14-自定义输入、输出函数

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

11.4 自定义输入/输出函数

不一定非要使用C库中的标准函数,如果无法使用这些函数或者不想用它们,完全可以在 getchar()putchar() 的基础上自定义所需的函数。假设你需要一个类似 puts() 但是不会自动添加换行符的函数。程序清单11.14给出了一个这样的函数。

程序清单11.14  put1() 函数

/* put1.c -- 打印字符串,不添加\n */
#include <stdio.h>
void put1(const char * string)/* 不会改变字符串 */
{
     while (*string != '\0')
          putchar(*string++);
}

指向 char 的指针 string 最初指向传入参数的首元素。因为该函数不会改变传入的字符串,所以形参使用了 const 限定符。打印了首元素的内容后,指针递增 1 ,指向下一个元素。 while 循环重复这一过程,直到指针指向包含空字符的元素。记住,因为要从右向左运算,因此 putchar( * string++) 打印 string 指向的值,递增的是 string 本身,而不是递增它所指向的字符。

可以把 put1.c 程序作为编写字符串处理函数的模型。因为每个字符串都以空字符结尾,所以不用给函数传递字符串的大小。函数依次处理每个字符,直至遇到空字符。

用数组表示法编写这个函数稍微复杂些:

int i = 0;
while (string[i]!= '\0')
          putchar(string[i++]);

要为数组索引创建一个额外的变量。

许多C程序员会在 while 循环中使用下面的测试条件:

while (*string)

string 指向空字符时,* string 的值是 0 ,即测试条件为假, while 循环结束。这种方法比上面两种方法简洁。但是,如果不熟悉C语言,可能觉察不出来。这种处理方法很普遍,作为C程序员应该熟悉这种写法。

注意 为什么程序清单11.14中的形式参数是 const char string ,而不是 const char string[] ?从技术方面看,两者等价且都有效。使用带方括号的写法是为了提醒用户:该函数处理的是数组。然而,如果要处理字符串,实际参数可以是数组名、用双引号括起来的字符串,或声明为 char 类型的变量。用 const char * string 可以提醒用户:实际参数不一定是数组。

假设要设计一个类似 puts() 的函数,而且该函数还给出待打印字符的个数。如程序清单11.15所示,添加一个功能很简单。

程序清单11.15  put2.c 程序

/* put2.c -- 打印一个字符串,并统计打印的字符数 */
#include <stdio.h>
int put2(const char * string)
{
     int count = 0;
     while (*string)    /* 常规用法 */
     {
          putchar(*string++);
          count++;
     }
     putchar('\n');    /* 不统计换行符 */
     return(count);
}

下面的函数调用将打印字符串 pizza

put1("pizza");

下面的调用将返回统计的字符数,并将其赋给 num (该例中, num 的值是 5 ):

num = put2("pizza");

程序清单11.16使用一个简单的驱动程序测试 put1()put2() ,并演示了嵌套函数的调用。

程序清单11.16  .c 程序

//put_put.c -- 用户自定义输出函数
#include <stdio.h>
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)  /* 与 *string != '\0' 相同 */
          putchar(*string++);
}
int put2(const char * string)
{
     int count = 0;
     while (*string)
     {
          putchar(*string++);
          count++;
     }
     putchar('\n');
     return(count);
}

程序中使用 printf() 打印 put2() 的值,但是为了获得 put2() 的返回值,计算机必须先执行 put2() ,因此在打印字符数之前先打印了传递给该函数的字符串。下面是该程序的输出:

If I'd as much money as I could spend,
I never would cry old chairs to mend.
I count 37 characters.