我一直在谷歌搜索这个问题好几个小时,到目前为止我还没有看到任何提及它。
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”附加到stdin的末尾我没有做任何事情。我通过读出每个不是'\ n'或\ 0'的字符来试图'冲洗'stdin,这也没有做任何事情。
编辑:为了澄清,'if'语句中的条件是占位符。
答案 0 :(得分:2)
您需要在某个地方存储数据:
if (sscanf(rawin,"%d") == 1)
也就是说,您的sscanf()
需要第三个参数:指向要存储此转换结果的整数的指针:
int in;
if (sscanf(rawin,"%d",&in) == 1)
此后您无需致电atoi()
。
作为旁注,您的示例中不需要动态分配的内存。一个简单的数组就足够了:
char rawin[100];
答案 1 :(得分:-3)
尝试使stdin无阻塞。
#include <unistd.h>
#include <fcntl.h>
fcntl(0, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
或者使用非阻止recv
代替fgets:
#include <sys/socket.h>
while(recv(0, inputString, 100, MSG_DONTWAIT) > 0)