c -两次调用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;
}

如果我调用这个函数两次,无论我第一次调用哪个都可以正常工作,但第二个行为奇怪。而不是进入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)

最新更新