2013-03-21 322 views
1

我一直在搜索这个问题几个小时,至今我还没有看到任何提及它。调用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” ,它什么都没做,我试着通过读出每个不是'\ n'或\ 0'的字符来试图'冲洗'stdin,这也没有任何作用。

编辑:澄清,'if “语句是一个占位符

+0

“for”代表什么? – 2013-03-21 13:18:38

+0

您确定有足够的输入可以被第二轮循环读取吗?如果'stdin'上的缓冲区为空,'fgets'将会被阻塞。输入来自哪里?如果你的第一次迭代从来没有你的break条件,那么第一个while循环将被读取直到'EOF',第二个循环将无限期地阻塞,除非任何发送输入决定恢复管道并发送更多数据。 – 2013-03-21 13:19:29

+0

@HalimQarroum:这应该是一个占位符。将解决。 – CybeatB 2013-03-21 13:20:43

回答

2

您需要存储数据某处:

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

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

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

此后您不需要拨打atoi()


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

char rawin[100]; 
+1

它工作。谢谢。 – CybeatB 2013-03-21 13:43:17

+0

@CybeatB很高兴能帮到你。下一次包括**所有**的代码,或者至少是再现错误的最小量。目前尚不清楚发生了什么事情,直到您从您之前的帖子中删除了迷惑。 – chrisaycock 2013-03-21 13:44:57

-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) 
相关问题