我已经在谷歌上搜索了几个小时了,到目前为止我还没有看到任何关于它的提及。
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;
}
如果我调用这个函数两次,无论我第一次调用哪个都可以正常工作,但第二个行为奇怪。而不是进入while循环,程序的行为就像在fgets上无限循环。对fgets的第二次调用永远不会完成,因此永远不会返回任何东西。在调试时,永远不会到达位于"while(fgets…)"之后的任何地方的断点,包括循环之后。我尝试将"n"," "one_answers"n "附加到stdin的末尾,但没有任何作用。我试过通过读取不是'n'或' 0'的每个字符来'刷新' stdin,这也没有做任何事情。
编辑:为了澄清,'if'语句中的条件是一个占位符。您需要将数据存储在某个地方:
if (sscanf(rawin,"%d") == 1)
也就是说,您的sscanf()
需要第三个参数:一个指向整数的指针,您希望在该指针中存储转换结果:
int in;
if (sscanf(rawin,"%d",&in) == 1)
在此之后您不需要调用atoi()
。
作为附带说明,在您的示例中不需要动态分配内存。一个简单的数组就足够了:
char rawin[100];
尝试将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)