函数不一定非要使用C库中的标准函数,如果无法使用这些函数或者不想用它们,完全可以在getchar()和putchar()的基础上自定义所需的函数 。假设你需要一个类似puts()但是不会自动添加换行符的函数 。程序 put1() 给出了一个这样的函数 。
/* put1.c -- prints a stringwithout adding n */#include <stdio.h>void put1(const char * string) /* string not altered */{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程序员应该熟悉这种写法 。
*注意*假设要设计一个类似puts()的函数,而且该函数还给出待打印字符的个数 。如程序 put2() 所示,添加一个功能很简单 。
【C语言的自定义输入和输出的三种方法】为什么程序put1()中的形式参数是const char * string,而不是const charstring[]?从技术方面看,两者等价且都有效 。使用带方括号的写法是为了提醒用户:该函数处理的是数组 。然而,如果要处理字符串,实际参数可以是数组名、用双引号括起来的字符串,或声明为char *类型的变量 。用const char * string可以提醒用户:实际参数不一定是数组 。
/* put2.c -- prints a string and counts characters */#include <stdio.h>int put2(const char * string){int count = 0;while (*string)/* common idiom*/{putchar(*string++);count++;}putchar('n');/* newline not counted */return(count);}
下面的函数调用将打印字符串pizza:put1("pizza");
下面的调用将返回统计的字符数,并将其赋给num(该例中,num的值是5):num = put2("pizza");
程序put_put.c使用一个简单的驱动程序测试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);}
程序中使用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.
推荐阅读
- 韭杞茶的功效有哪些呢,减肥功效好的茶有哪些
- C语言处理字符串的7个函数
- 旧硬盘应该如何处理,阿卡西斯的这款雷电3硬盘盒给出了答案
- 喝西湖龙井的好处,喝西湖龙井的注意事项
- 解密中国人自己的操作系统DIM-SUM
- 可以排毒的茶有哪些,荷叶泡茶的作用有哪些
- 高效编程的11条规则
- goroutine的退出与泄露:如何检测和预防
- 《王者荣耀》连胜封号规则是怎样的?
- Spring Boot+Socket实现与html页面的长连接