【问题标题】:Inputting EOF notation when using getch() for standard input使用 getch() 进行标准输入时输入 EOF 表示法
【发布时间】:2014-11-13 08:17:22
【问题描述】:

这是我程序的一个片段

     #include<stdio.h>
#include<conio.h>
int main(void)
{
    int c;
    while ((c = getch()) != EOF)
    {
        if (c == '\t')
        {
            putchar('\\');
            putchar('t');
        }
        else if (c == '\b')
        {
            putchar('\\');
            putchar('b');
        }
        else if (c == '\\')
        {
            putchar('\\');
            putchar('\\');
        }
        else if (c == '\r')
        {
            puts("\\n");
          //  putchar('\n');
        }
        else{
            putchar(c);
        }
    }
    return 0;
}

我想在输入 EOF 时终止我的输入,但是当我输入 ^Z 时,我只得到这个: 那么如何输入 ^Z 来终止我的输入呢?

【问题讨论】:

  • c 的类型是什么?应该是int。如果是char,则永远不可能是EOF
  • @MikeSeymour 代码无关紧要并且是多余的,问题更多的是关于 CMD 终端而不是有问题的程序。它实际上更适合 SuperUser.com
  • 找到相关的东西(我猜是(-;):stackoverflow.com/questions/7373386/…
  • 你可以试试ctrl+D
  • @sashoalm:除非问题是 c 是错误的类型,这是所描述症状的可能原因之一。

标签: c++ c visual-c++


【解决方案1】:

您的程序运行良好......但getch 并没有完全按照您的预期运行。

getch(来自 conio.h)和getchar(来自 stdio.h)都一次获得一个字符,但不在同一级别。 getchar 级别更高,所以:

  • 在标准输入上读取(可以重定向)
  • 在面向行的模式下等待一个完整的缓冲区
  • Ctrl-C 中断(更确切地说,Ctrl-C 被视为 SIG_INT 信号)
  • 将 Unix-Linux 上的特殊字符 Ctrl-D 转换为 Windows 上的 Ctrl-Z 为 EOF

另一方面,getch 是低级的(存在于 Microsoft 系统中,但不是标准 C):

  • 直接在键盘上读取
  • 按原样传递包括Ctrl-CCtrl-Z 在内的任何字符
  • 唯一可能的中断是通过Ctrl-Break
  • 从不返回 EOF (== -1)

所有使用getch 的例子都是一样的:定义你输入字符的结尾并手动测试它,没有神奇的EOF。

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多