4

我正在使用下面的 C 代码从终端读取用户输入。如果用户输入 EOF,例如通过按 ^C,stdin 将关闭,随后尝试从中读取,例如通过 getchar() 或 scanf(),将导致异常。

我可以在 C 中做些什么来“恢复”我的程序,因为如果某些用户不小心输入了 EOF,这将被忽略,所以我可以再次从标准输入读取?

#include <stdio.h>

int main(void)
{
    int res_getchar=getchar();
    getchar();
    return 0;
}
4

3 回答 3

4

如果我正确理解了情况-您正在通过终端阅读stdin,用户键入^D,您想丢弃它并再次要求输入-您有两个选择,一个更便携(并且非常简单)但不太可能工作,和一个不那么便携(和更多的编程),但肯定可以工作。

  • clearerr函数是标准 C 语言,并记录在案以清除FILE对象上的粘性错误和粘性 EOF 标志;read如果您的问题是一旦指示 EOF 一次,C 库就不会再次调用,这可能会有所帮助。

    如果这解决了您当前的问题,请确保如果您连续获得一定数量的 EOF(例如,四到十个)您放弃并退出,因为如果不是stdin终端,或者终端已真正关闭, EOF 条件永远不会消失,当这种情况发生时,您不希望您的程序陷入无限循环。

  • 仅在符合 POSIX 的系统上(即“非 Windows”),您可以使用cfmakeraw禁用输入预处理,该预处理会^D变成 EOF 指示。

    这样做意味着您还必须自己处理很多其他事情;您可能希望使用为您处理它的第三方库,例如readline (GPL) 或editline (BSD)。如果您的程序是任何类型的重要交互式命令解释器,强烈建议使用其中一个库,因为它将提供更好的用户体验。

于 2013-11-02T17:25:09.340 回答
1

使用ungetc()推回字符可以清除流的 EOF 指示符。

C99 §7.19.7.11ungetc函数

 int ungetc(int c, FILE *stream);

对该函数的成功调用将ungetc清除流的文件结束指示符。在读取或丢弃所有回推字符后,流的文件位置指示符的值应与回推字符之前的值相同。

于 2013-11-02T17:05:04.933 回答
0

一句话,没有。当操作系统关闭标准输入时,您读取 EOF。

我确信有一些依赖于平台的方法来保留一些信息,这些信息可以让您在关闭标准输入后重建标准输入——即打开一个连接到键盘的新流并将其分配给标准输入——但绝对没有可移植的方法。

于 2013-11-02T17:02:14.210 回答