我一直在搜索这个问题几个小时,至今我还没有看到任何提及它。调用fgets()两次导致第二次调用不完成
int getInt()
{
char* rawin = (char*)malloc(100);
printf("How big should the secret code be?\n(Input number of elements):\n");
while(fgets(rawin, 100, stdin) != NULL)
{
if (sscanf(rawin,"%d") == 1)
{
break;
}
printf("Numbers only please.\n");
}
int in = atoi(rawin);
free(rawin);
return in;
}
如果我调用此函数两次,我叫哪一个首先能正常工作,但第二个行为异常。程序的行为就像在fgets上无限循环一样,而不是进入while循环。 fgets的第二个调用永远不会完成,所以永远不会返回任何东西。调试时,在“while(fgets ...)”之后的任何位置放置断点,包括循环之后,永远不会到达。我试图在标准输入的结尾附加“\ n”,“\ 0”和“\ n \ 0” ,它什么都没做,我试着通过读出每个不是'\ n'或\ 0'的字符来试图'冲洗'stdin,这也没有任何作用。
编辑:澄清,'if “语句是一个占位符
“for”代表什么? – 2013-03-21 13:18:38
您确定有足够的输入可以被第二轮循环读取吗?如果'stdin'上的缓冲区为空,'fgets'将会被阻塞。输入来自哪里?如果你的第一次迭代从来没有你的break条件,那么第一个while循环将被读取直到'EOF',第二个循环将无限期地阻塞,除非任何发送输入决定恢复管道并发送更多数据。 – 2013-03-21 13:19:29
@HalimQarroum:这应该是一个占位符。将解决。 – CybeatB 2013-03-21 13:20:43