调用fgets()两次会导致第二次调用未完成

时间:2013-03-21 13:13:50

标签: 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;
}

如果我两次调用此函数,无论我先调用哪一个都可以正常工作,但第二个表现得很奇怪。程序的行为就像在fgets上无限循环一样,而不是进入while循环。 fgets的第二次调用永远不会完成,所以永远不会返回任何内容。在调试时,在“while(fgets ...”之后的任何位置放置断点,包括循环之后,永远不会到达。我尝试将“\ n”,“\ 0”和“\ n \ 0”附加到stdin的末尾我没有做任何事情。我通过读出每个不是'\ n'或\ 0'的字符来试图'冲洗'stdin,这也没有做任何事情。

编辑:为了澄清,'if'语句中的条件是占位符。

2 个答案:

答案 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)