该程序在读到EOF字符(这种情况下s_gets()返回NULL)、用户输入quit或输入项达到LIM时退出 。
顺带一提 , 有时输入空行(即 , 只按下Enter键或Return键)表示结束输入更方便 。为实现这一功能 , 只需修改一下while循环的条件即可:
while (ct < LIM && s_gets(input[ct], SIZE) != NULL&& input[ct][0] != '0')
这里 , input[ct]是刚输入的字符串 , input[ct][0]是该字符串的第1个字符 。如果用户输入空行 , s_gets()便会把该行第1个字符(换行符)替换成空字符 。所以 , 下面的表达式用于检测空行:
input[ct][0] != '0'
2.strncmp()函数
strcmp()函数比较字符串中的字符 , 直到发现不同的字符为止 , 这一过程可能会持续到字符串的末尾 。而strncmp()函数在比较两个字符串时 , 可以比较到字符不同的地方 , 也可以只比较第3个参数指定的字符数 。例如 , 要查找以"astro"开头的字符串 , 可以限定函数只查找这5个字符 。程序starsrch.c演示了该函数的用法 。
/* starsrch.c -- use strncmp() */#include <stdio.h>#include <string.h>#define LISTSIZE 6int main(){const char * list[LISTSIZE] ={"astronomy", "astounding","astrophysics", "ostracize","asterism", "astrophobia"};int count = 0;int i;for (i = 0; i < LISTSIZE; i++)if (strncmp(list[i],"astro", 5) == 0){printf("Found: %sn", list[i]);count++;}printf("The list contained %d words beginning"" with astro.n", count);
下面是该程序的输出:
Found: astronomyFound: astrophysicsFound: astrophobiaThe list contained 3 words beginning with astro.
5 strcpy()和strncpy()函数前面提到过 , 如果pts1和pts2都是指向字符串的指针 , 那么下面语句拷贝的是字符串的地址而不是字符串本身:
pts2 = pts1;
如果希望拷贝整个字符串 , 要使用strcpy()函数 。程序copy1.c要求用户输入以q开头的单词 。该程序把输入拷贝至一个临时数组中 , 如果第1个字母是q , 程序调用strcpy()把整个字符串从临时数组拷贝至目标数组中 。strcpy()函数相当于字符串赋值运算符 。
/* copy1.c -- strcpy() demo */#include <stdio.h>#include <string.h>// declares strcpy()#define SIZE 40#define LIM 5char * s_gets(char * st, int n);int main(void){char qwords[LIM][SIZE];char temp[SIZE];int i = 0;printf("Enter %d words beginning with q:n", LIM);while (i < LIM && s_gets(temp, SIZE)){if (temp[0] != 'q')printf("%s doesn't begin with q!n", temp);else{strcpy(qwords[i], temp);i++;}}puts("Here are the words accepted:");for (i = 0; i < LIM; i++)puts(qwords[i]);return 0;}char * s_gets(char * st, int n){char * ret_val;int i = 0;ret_val = fgets(st, n, stdin);if (ret_val){while (st[i] != 'n' && st[i] != '0')i++;if (st[i] == 'n')st[i] = '0';else // must have words[i] == '0'while (getchar() != 'n')continue;}return ret_val;}
下面是该程序的运行示例:
Enter 5 words beginning with q:注意 , 只有在输入以q开头的单词后才会递增计数器i , 而且该程序通过比较字符进行判断:
quackery
quasar
quilt
quotient
no more
no more doesn't begin with q!
quiz
Here are the words accepted:
quackery
quasar
quilt
quotient
quiz
if (temp[0] != 'q')
这行代码的意思是:temp中的第1个字符是否是q?当然 , 也可以通过比较字符串进行判断: if (strncmp(temp, "q", 1) != 0)
这行代码的意思是:temp字符串和"q"的第1个元素是否相等?请注意 , strcpy()第2个参数(temp)指向的字符串被拷贝至第1个参数(qword[i])指向的数组中 。拷贝出来的字符串被称为目标字符串 , 最初的字符串被称为源字符串 。参考赋值表达式语句 , 很容易记住strcpy()参数的顺序 , 即第1个是目标字符串 , 第2个是源字符串 。
char target[20];int x;x = 50;/* assignment for numbers */strcpy(target, "Hi ho!");/* assignment for strings */target = "So long";/* syntax error*/
程序员有责任确保目标数组有足够的空间容纳源字符串的副本 。下面的代码有点问题:char * str;strcpy(str, "The C of Tranquility"); // a problem
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- C语言的自定义输入和输出的三种方法
- 旧硬盘应该如何处理,阿卡西斯的这款雷电3硬盘盒给出了答案
- 编写C程序控制LED
- 还不知道MySQL怎么给字符串加索引?
- C语言的指针与多维数组
- 架构大更新的英特尔Rocket Lake处理器可将频率提升至5.0GHz
- 被蛇咬伤的处理方法 被蛇咬伤应该怎么处理?
- 使用pandas处理时间变量
- C语言的数组的构建与打印
- 驾考5次不过咋处理?