1

我已经用谷歌搜索这个问题几个小时了,到目前为止我还没有看到任何提及它。

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 循环不同,程序的行为就像在 fget 上无限循环一样。fgets 的第二次调用永远不会完成,因此永远不会返回任何内容。调试时,永远不会到达“while(fgets...”之后任何位置的断点,包括循环之后。我尝试将“\n”、“\0”和“\n\0”附加到标准输入的末尾,它什么也没做。我尝试通过读出每个不是“\n”或\0'的字符来“刷新”标准输入,这也没有做任何事情。

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

4

2 回答 2

2

您需要将数据存储在某个地方:

if (sscanf(rawin,"%d") == 1)

也就是说,您sscanf()需要第三个参数:指向要存储此转换结果的整数的指针:

int in;
if (sscanf(rawin,"%d",&in) == 1)

你不需要atoi()在这之后打电话。


作为旁注,您的示例中不需要动态分配的内存。一个简单的数组就足够了:

char rawin[100];
于 2013-03-21T13:33:44.023 回答
-3

尝试使标准输入非阻塞。

#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)
于 2013-03-21T13:26:00.807 回答