fgets 不阻塞输入 - C

问题描述 投票:0回答:3

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

我使用 fgets 读取输入,但有时 fgets 不会阻塞(使程序陷入无限循环)。为了回答每个人的第一个问题,不,我没有在手动留下额外的

\n
之前使用 scanf ,这会导致这个问题。我曾经使用过 sscanf,但这与 fgets 相关,所以我认为这不是问题。

我们提供了一些处理套接字的代码。我已经查看了它,但找不到问题的根源。由于长度原因,代码未包含在内,但如果有帮助,我可以包含它。

长话短说,除了 scanf 问题之外,还有什么原因 fgets 不会阻止输入吗?如有任何帮助,我们将不胜感激!

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

c stdin scanf fgets
3个回答
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");
    }
}

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


0
投票

我知道这是一个较旧的问题,但我想我应该分享我遇到这个问题时发现的内容。没有您的代码,我无法判断这是否与您遇到的问题相同,但我在自己的代码中发现,我在设置为 0 的文件描述符上使用

close()
。出于好奇,我查找了文件描述符 0 是什么在系统中,并且标准输入是 FD 0 (http://en.wikipedia.org/wiki/File_descriptor)。我确信有很多方法可以解决这个问题,但就我而言,我在结束时使用了一个简单的 if 语句:

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

0
投票

我也有同样的问题。我在同一个程序中同时使用了 fget 和 scanf 。当我将所有内容更改为 fget 时,问题就消失了。

更改了所有的scanf:

printf("[?]Enter a name for saving the file: ");
scanf("%99s", fileName);

要获取:

printf("[?]Enter a name for saving the file: ");
fgets(fileName, sizeof(fileName), stdin);
fileName[strcspn(fileName, "\n")] = '\0';
© www.soinside.com 2019 - 2024. All rights reserved.