C Primer Plus(6) 中文版 第11章 字符串和字符串函数 11.4 自定义输入/输出函数

发布于:2023-01-08 ⋅ 阅读:(489) ⋅ 点赞:(0)

11.4 自定义输入/输出函数
不一定非要使用C库中的标准函数,如果无法使用这些函数或者不想用它们,完全可以在getchar()和putchar()的基础上自定义所需的函数。
类似puts()但是不会自动添加换行符的函数。
程序清单 11.14 put1()函数
/* put1.c -- 打印字符串,不添加\n */
#include <stdio.h>
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 <stdio.h>
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 <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)  /* 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(),因此在打印字符数之前先打印了传递给该函数的字符串。 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到