3

我正在为学校编写程序;这是我第一次与 C 合作。

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

有一些代码提供给我们处理套接字。我已经浏览了它,但找不到问题的根源。由于篇幅原因,代码没有包含在内,但如果有帮助,我可以包含它。

长话短说,除了 scanf 问题,fgets 是否有任何理由不阻止输入?任何帮助表示赞赏!

编辑:我应该在早些时候更清楚地说明这一点,但在这种情况下,我仅将 fgets 用于标准输入。

4

2 回答 2

0

与 C 中的大多数标准函数一样,您需要进行一些挖掘才能弄清楚发生了什么。最好的起点是功能文档。

fgets() 文档

从这个文档中,我们可以看到 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");
    }
}

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

于 2013-01-14T23:54:12.133 回答
0

我知道这是一个较老的问题,但我想我会分享我遇到这个问题时的发现。如果没有您的代码,我无法判断这是否与您遇到的问题相同,但我在自己的代码中发现我使用close()的是设置为 0 的文件描述符。好奇我查找了文件描述符 0 在系统和低标准输入是 FD 0 ( http://en.wikipedia.org/wiki/File_descriptor )。我确信有很多方法可以解决这个问题,但在我的例子中,我使用了一个简单的 if 语句来结束我的关闭:

if(fd > 2)
{
close(fd);
}
于 2013-03-05T15:44:53.860 回答