Ввод записи EOF при использовании getch () для стандартного ввода

0

вот фрагмент моей программы

     #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, но когда я ввожу ^ ZI, получим только это: Изображение 174551, так как я могу ввести ^ Z для завершения ввода?

  • 1
    Какой тип c ? Это должно быть int . Если это char , то он никогда не может быть EOF .
  • 0
    @MikeSeymour Код не имеет значения и является избыточным, вопрос скорее в терминале CMD, чем в рассматриваемой программе. Это на самом деле лучше подходит для SuperUser.com
Показать ещё 5 комментариев
Теги:
visual-c++

1 ответ

3

Ваша программа отлично работает... но getch не делает именно то, что вы ожидаете.

getch (from conio.h) и getchar (из stdio.h) одновременно получают один символ за раз, но не на одном уровне. getchar - более высокий уровень, и поэтому:

  • читает на stdin (может быть перенаправлен)
  • ожидает полного буфера в режиме линии
  • прерывается Ctrl-C (точнее, Ctrl-C рассматривается как сигнал SIG_INT)
  • переводит специальные символы Ctrl-D в Unix-Linux Ctrl-Z в Windows как EOF

С другой стороны, getch является низкоуровневым (и существует в системах Microsoft, но не является стандартным C):

  • прямо читает на клавиатуре
  • передать любой символ, включая Ctrl-C и Ctrl-Z как это
  • единственное возможное прерывание - через Ctrl-Break
  • никогда не возвращает EOF (== -1)

Все примеры с использованием getch работают одинаково: вы определяете, каков будет ваш конец входного символа, и вручную проверите его, нет волшебного EOF.

  • 0
    @chux: Спасибо за точность. Сообщение обновлено

Ещё вопросы

Сообщество Overcoder
Наверх
Меню