C语言学习笔记——字符串操作( 三 )


[root@gavinpan p2]# !../fgets3 Enter strings (empty line to quit):hellohelloc primer plusc primer Done.
相比于.c,.c中丢弃了多余的输入,相关代码为:
while (getchar() != '\n') { continue;}
自定义的()函数
示例代码:
/*** char *s_gets(char *, int);** 获取字符串输入*/char *s_gets(char *st, int len) {char *ret;// 接收fgets()函数的返回值int i = 0;ret = fgets(st, len, stdin);if (ret) {// ret != NULLwhile (st[i] != '\n' && st[i] != '\0') {i++;}if (st[i] == '\n') {// 处理换行符\nst[i] = '\0';} else {while (getchar() != '\n') { // 丢弃多余字符continue;}}}return ret;}
那么为什么要丢弃输入行中的多余字符呢?因为,输入行中的多余字符会被留在缓冲区,成为下一次读取语句的输入 。
scanf()函数
相比于gets()和fgets(),scanf()更像是“获取单词”的函数 。scanf()函数有两种方法确定输入结束:
其一,如果使用%s转换说明,则以下一个空白字符(空行、空格、制表符或换行符)作为字符串的结束(不包括空白字符) 。
其二,如果指定了字段宽度,如s,那么scanf()将读取10个字符或读到第1个空字符停止 。
见如下示例:
/*** scanf1.c* scanf()函数输入结束示例*/#include #define STLEN 10void clear_buf(void);int main(void) {char name[STLEN];puts("Enter some lines");scanf("%s", name);printf("result of \"%%s\": %s\n", name);clear_buf();// 清除缓冲区多余字符scanf("%5s", name);printf("result of \"%%5s\": %s\n", name);clear_buf();scanf("%5s", name);printf("result of \"%%5s\": %s\n", name);clear_buf();return 0;}void clear_buf(void) {while (getchar() != '\n') {continue;}}
运行结果示例:
[root@gavinpan p2]# ./scanf1 Enter some linesHeroes come and goresult of "%s": Heroes // 空格结束Heroes come and goresult of "%5s": Heroe // 5个字符长度结束Kobe Bryantresult of "%5s": Kobe // 空格结束
在看scanf()的使用示例:
/*** scanf()函数的使用示例*/#include #define STRLEN 12int main(void) {char name1[STRLEN], name2[STRLEN];int count;printf("Please enter 2 names:\n");count = scanf("%5s s", name1, name2);printf("I read the %d names %s and %s\n", count, name1, name2);return 0;}
以下为3个输出示例:
[root@gavinpan p2]# !../scanf_str1 Please enter 2 names:Terry LampardI read the 2 names Terry and Lampard[root@gavinpan p2]# !../scanf_str1 Please enter 2 names:Cech DrogbaI read the 2 names Cech and Drogba[root@gavinpan p2]# !../scanf_str1 Please enter 2 names:Lampard KanteI read the 2 names Lampa and rd
如果输入行的内容过长,scanf()也会导致数据溢出 。不过,在%s转换说明中使用字段宽度,可防止溢出 。
字符串输出puts()函数
puts()函数的入参为字符串的地址,在显示字符串时,会自动在末尾添加一个换行符 。其使用示例如下:
/*** put_out1.c* puts()函数的使用*/#include #define STRLEN 50#define DEF "I am a #defined string."int main(void) {char str1[STRLEN] = "An array was initialized to me.";const char *pt1 = "A pointer was initilized to me.";puts("I am an argument to \"puts()\".");puts(DEF);puts(str1);puts(pt1);puts(&str1[3]);// 从第4个字符开始puts(pt1 + 3);// 从第4个字符开始return 0;}
输出如下:
[root@gavinpan p2]# ./put_out1 I am an argument to "puts()".I am a #defined string.An array was initialized to me.A pointer was initilized to me.array was initialized to me.ointer was initilized to me.