C语言gets()问题 50

这个程序是想判断是否是C语言合法标识符,可是gets函数在这里就像罢工似的,根本不执行,先输入样例个数(这是ACM入门题,所以会有这个要求),我一运行先输入3,还没等输入... 这个程序是想判断是否是C语言合法标识符,可是gets函数在这里就像罢工似的,根本不执行,先输入样例个数(这是ACM入门题,所以会有这个要求),我一运行先输入3,还没等输入字符串直接来个no,如果不是字符串带空格我才不用gets,最近用这个频繁出毛病,放在循环里也不能读多个字符串,代码如下。 展开
 我来答
寇洋板炳君
2019-08-23 · TA获得超过3671个赞
知道大有可为答主
回答量:3024
采纳率:25%
帮助的人:193万
展开全部
因为你在使用gets之前还使用过别的读入函数(或宏),有的是不会把末尾的换行读取掉的,就会留在缓冲区,当你调用gets时,把上一次的换行字符给读取了,所以就像直接跳过了。
改善的方法是为gets函数上一句加上getchar();用于吸收回车。或是加fflush(stdin);刷新缓冲区。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
樊俐法云霞
2019-03-01 · TA获得超过4026个赞
知道大有可为答主
回答量:3143
采纳率:28%
帮助的人:198万
展开全部
应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到缓冲区后面的内存位置,这将破坏一个或多个不相关变量的值。
可能是buffer缓冲区不够大造成的,也或者异常终止是gets使用错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xoaxa
2017-02-26 · TA获得超过8610个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3478万
展开全部
#include<stdio.h>
#include<ctype.h>

int main(void) {
char s[81];
int i,n,f;
scanf("%d",&n);
while(n--) {
fflush(stdin);
gets(s);
if(s[i] >= '0'&&s[i] <= '9') {
f = 0;
continue;
}
else {
for (i = 1; s[i]; ++i) {
if(isdigit(s[i])||isalpha(s[i])||(s[i] == '_')) f  = 1;
else f = 0;
}
}
if(f) printf("YES\n");
else printf("NO\n");
}
return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
於苒琦芳泽
2020-05-03 · TA获得超过4096个赞
知道大有可为答主
回答量:3072
采纳率:30%
帮助的人:451万
展开全部
1.gets是以回车为结尾的.
你在字符串中提前键入的回车
2.
是缓存区问题..
有可能是没有在gets
之前清空缓存区.
导致上文的输入被当作gets的了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
肥醉瑞雅宁
2019-03-16 · TA获得超过3842个赞
知道大有可为答主
回答量:3118
采纳率:32%
帮助的人:164万
展开全部
gets
和scanf混用时要在
scanf
后面加getchar
因为scanf
不接受回车和空格
所以要getchar过滤掉回车和空格
然后才能用gets来完整的接受
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式