碰到问题:
当执行下面的程序时,如果输入ABC,则输出结果是( )。
#include <stdio.h>
#include <string.h>
int main()
{ char ss[10]="1,2,3,4,5";
gets(ss);strcat(ss, "6789");
printf("%s\n",ss);
}(A) ABC6789 (B) ABC67 (C) 12345ABC6 (D) ABC456789
思路分析:
作为一个基础不大好的编程小白 咦,gets是什么鬼?先缓一缓,先看看后面的.
有意识的话 strcat应该能猜到是什么,和上一篇中的函数strcpy长得及其相似(都有str...),而且题目中的头文件也有#include<string.h>,幸好这会不是考试,这个时候不懂,不会做,百度.
即:strcat(str,ptr)是将字符串ptr内容连接到字符串str后,然后得到一个组合后的字符串str
理论分析应该就是strcat(ss,"6789")=====>ss + "6789"
查询了gets的用法:
gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。
到这里的时候我其实猜测答案应该是C,我想的是前面已经是12345,再输入ABC,后面追加6789,即输出结果为12345ABC6,然后我用编译器操作了一下,结果不对.
输出结果是ABC6789,咦,郁闷了!为什么?凭什么?不应该啊???
然后找到了科学的解释:gets输入了值会覆盖ss中原有的内容
执行代码:
#include<stdio.h>
#include<string.h>
int main()
{
char ss[10]="1,2,3,4,5";
gets(ss);
strcat(ss,"6789");
printf("%s\n",ss);
return 0;
}
测试:
输入ABC,结果为:
本着杠精的原则,输入12345,结果为:
等等ss[10]不应该有10个么,算上字符串尾的结束符"\0"在内,好像"ABC6789"缺点东西
只输入A,测试一下:
咦,奇怪,搞长一点试试:
哎哟我的天,什么情况?不应该这么长吧,这不止10个吧?
遇到事情不要慌,根据刚才收集的知识,仔细分析,得出:gets()函数存在一个严重的缺陷,这个缺陷就是:它不会检查数组是否能够装得下输入行。