fgets没有阻止输入 - C

时间:2013-01-14 23:39:42

标签: c stdin scanf fgets

我正在为学校写一个课程;这是我第一次和C.一起工作。

我正在使用fgets来读取输入,但有时fgets不会阻塞(将程序抛入无限循环)。为了回答每个人的第一个问题,不,我不会在离开额外的\n之前使用scanf,这会导致这个问题。我一度使用sscanf,但这与fgets有关,所以我认为这不是问题。

有一些代码是我们处理套接字的。我仔细研究过,找不到问题的根源。由于长度不包括代码,但如果有帮助,我可以包括它。

长话短说,除了scanf问题之外,有什么理由不会阻止输入?任何帮助表示赞赏!

编辑:我之前应该更清楚地说明这一点,但在这种情况下,我只是将fgets用于stdin。

2 个答案:

答案 0 :(得分:0)

与C中的大多数标准功能一样,您需要进行一些挖掘以找出正在发生的事情。最好的起点是功能文档。

fgets() documentation

从这个文档中,我们可以看到fgets接受三个参数并返回一个char *。假设参数正确,函数将从流中读取,直到它到达换行符或文件结束标记。在成功的情况下,返回码将是指向str参数的指针。

然而,您可能更感兴趣的案例是失败案例。失败时,该函数返回NULL。要确定故障的确切程度,您需要检查文件错误指示器并查看是否已打印消息。这可以按如下方式完成:

if ( fgets (mystring , 100 , pFile) == NULL )
{
    // We handle error here
    if (ferror (pFile))
    {
        printf ("We encountered an error!\n");
        perror ("Error message");
    }
}

从这里开始,您应该能够确定发生了什么。可能的原因是参数无效或参数不符合预期的格式/条件。

答案 1 :(得分:0)

我知道这是一个较老的问题,但我想我会分享我在遇到这个问题时发现的问题。没有你的代码,我无法分辨你是否有同样的问题,但我在自己的代码中发现的是我在设置为0的文件描述符上使用close()。很好奇我查找了什么文件描述符0在系统中并且低并且看到stdin是FD 0(http://en.wikipedia.org/wiki/File_descriptor)。我确信有很多方法可以解决这个问题,但在我的案例中,我使用了一个简单的if语句:

if(fd > 2)
{
close(fd);
}