Как я могу генерировать EOF (или ASCII 0) в консоли отладки Visual Studio? - PullRequest
1 голос
/ 20 января 2012

У меня есть программа в режиме консоли, работающая в Windows.Программа вызывает getchar() в цикле unitl или возвращается EOF или 0.Я хотел бы ввести одно из следующих значений в качестве тестового вектора при запуске отладчика:

"abc\0" или "abc\EOF

Я не могу генерировать последовательно либоЯ попробовал предложение в этом вопросе , набрав a b c CTRL-Z ENTER».Это возвращает 97,98,99,26 моей программе, а затем зависает при следующем вызове getchar().

Ввод CTRL-D тоже не помогает, getchar возвращает 4 для контрольного символа, затем символ новой строки, а затем дублирует строку, которую я только что ввел на консоли,Как будто VS использует управляющие символы для редактирования символов.

EDIT:
Вот урезанная версия кода, который я использую.Я вижу идентичное поведение в консоли отладки и в командном окне.

#define MAXSZ 4096
int main(int argc, char **argv)
{
   short int data[MAXSZ]={0}, i=0; 
   char c;
   do {
      if (i==MAXSZ) break;
      c = getchar();
      if (c!=EOF) data[i]=c;
   } while (data[i++]!=0);
   for (i=0;data[i]&&i<MAXSZ;i++)
      putchar(data[i]);
}

Как ввести EOF или ASCII 0 в отладке Visual Studio в консоли Windows?

Ответы [ 3 ]

1 голос
/ 20 января 2012

Попробуйте это:

<Enter><Ctrl-Z><Enter>.
0 голосов
/ 30 мая 2014

В вычислительной технике EOF - это состояние в операционной системе компьютера, когда из источника данных больше нельзя считывать данные.Вообще говоря, чтение из терминала никогда не приведет к EOF.Вместо этого программы распознают, что источником является терминал (или другое «символьное устройство»), и интерпретируют данный зарезервированный символ или последовательность в качестве индикатора конца файла;

most commonly this is an ASCII Control-Z, or Control-D
0 голосов
/ 10 сентября 2013

@ Решение Hans Passant у меня работает - должно работать и для OP.
1 Чтобы сгенерировать ASCII 0, введите (Ctrl + @) или (Ctrl + 2)
2 Чтобы сгенерировать EOF, введите (Ctrl + Z Enter), но входной буфер должен быть пустым. Так что обычно это после an (Enter), таким образом (Enter Ctrl + Z Enter).

Но у кода OP есть проблемы.

char c; // should be int ch
do {
   ...
   c = getchar();
   if (c!=EOF) data[i]=c;
} while (...);

В OP-коде, если встречается символ ASCII 255, ему присваивается значение char (-1), которое сравнивается с EOF. Вместо этого используйте int ch.

   if (c!=EOF) data[i]=c;
   // should be
   if (c==EOF) break;
   data[i]=c;

Это предотвращает зацикливание кода или его ошибку при возникновении EOF.


Для ввода ASCII 255
(Клавиша Alt вниз, цифровая клавиатура 2, цифровая клавиатура 5, цифровая клавиатура 5, цифровая клавиша вверх)

...