2009-11-24 2 views
15

У меня есть небольшой фрагмент кода ниже, который я использую, используя PellesC.Почему getchar() не распознает возврат как EOF на консоли?

Когда код выполнен, и я набрал несколько символов в консоли, я нажимаю клавишу ввода.

Вы объяснили причину, почему линия printf("%ld\n", nc); не выглядит удовлетворительной? Поскольку на консоль не записывается вывод.

#include <stdio.h> 

int main(void) 
{ 
    long nc = 0; 

    while(getchar() != EOF) 
    { 
     ++nc; 
    } 

    printf("%ld\n", nc); 
} 

Я решил изучить C тщательно, используя R книгу K & и я стесняюсь сказать, что это довольно элементарный пример имеет меня в тупик.

ответ

33

Нажатие кнопки ввода фактически не вызывает EOF («конец файла»). Вы должны сообщить, что вы полностью закончили с предоставлением ввода; на Unix вы обычно это делаете, нажимая CtrlD. В Windows я считаю, что это CtrlZ за которым следует ввод, но я действительно не уверен в этом.

+1

Я действительно использую Windows и Ctrl + Z является правильным. Спасибо, я никогда не новичок. –

+0

it ** is ** ctrl + z –

4

Как вы заканчиваете свой вход и в какой системе вы работаете?

Если вы нажмете комбинацию клавиш «прерывание» или «убить», возможно, вы убиваете свой процесс до его печати.

Если вы используете что-то вроде Ctrl-D в unix или Ctrl-Z в начале строки в окнах, это будет сигнализировать «конец ввода», не убивая процесс.

Вы также можете попробовать перенаправить свой ввод из тестового файла. например:

myprogram <input.txt 
1

"Press enter"? Цикл вашего кода продолжает повторяться до тех пор, пока он не достигнет маркера конца файла. «Нажатие ввода» не приведет к EOF. Если вы хотите имитировать EOF с клавиатуры, обратитесь к документации для вашего терминала. В Windows, например, вам нужно нажать Ctrl + Z для генерации EOF.

0

getchar() возвращает значение из стандарта (обычно это клавиатура). Я не помню, к какому символу будет отображаться EOF, но вы, вероятно, не можете его вводить.

+1

EOF не соответствует любому персонажу. EOF имеет отрицательное значение, 'getchar()' возвращает значение следующего символа в потоке 'stdin' cast для' unsigned char' ... так что положительное значение ... или EOF – pmg

+0

** getchar (3) * * - функция 'int', возвращающая' EOF' (обычно -1), чтобы сигнализировать конец файла. 'EOF' не является символом, и именно по этой причине' getchar() 'возвращает' int' вместо 'char'. –

4

В Windows либо CTRL-Z, либо F6 будут сигнализировать конец файла.

2

ENTER записано под кодом '\n'. Попробуйте

#include <stdio.h> 

int main(void) 
{ 
    long nc = 0; 

    /* count chars, except for ENTER */ 
    while(getchar() != '\n') 
    { 
     ++nc; 
    } 

    printf("%ld\n", nc); 
    return 0; 
} 
18

Вы только получите EOF из потока, когда конец файла достигнут, не конец строки. Как вы сигнализируете, что конец файла зависит от настроек вашей ОС и терминала.

Это обычно CTRLd на системах UNIX типа и CTRLг на Windows. Для UNIX в готовом режиме (обычный режим ввода) вам обычно нужно вводить его в качестве первого символа строки и следовать за ним с помощью новой строки (ENTER).

В Windows, то CTRLг можно вводить в любом месте на линии, но все-таки нужно следовать новой строки.

В UNIX, действительный символ, чтобы сообщить интерфейс терминала, который вы хотите отправить EOF, может быть задан командой stty. Если выполнить stty -a, вы увидите что-то вроде:

speed 38400 baud; rows 45; columns 150; line = 0; 
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; 
eol = <undef>; eol2 = <undef>; swtch = ^Z; start = ^Q; 
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; 
flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl 
-cstopb cread -clocal -crtscts -ignbrk brkint -ignpar -parmrk 
-inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany 
-imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill 
-ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo 
-echoe -echok -echonl -noflsh -tostop -echoctl -echoke 

Вы можете увидеть в конце второй строки, eof устанавливается в ^D (CTRLд). Вы можете изменить это с помощью:

stty eof ^x 

установить его CTRLх, например. Вы также можете установить огромное количество других вещей, большинство из которых сделают ваш текущий терминал непригодным для использования, поэтому будьте осторожны :-)

Нижняя строка, если вы хотите сообщить программе, что файл закончен, используйте CTRLd для UNIX (или проверить stty, если это не работает) или CTRLг для Windows. Если вы хотите просто получить линию ввода, используйте \n символ в коде следующим образом:

#include <stdio.h> 
int main (void) { 
    long nc = 0; 
    while(getchar() != '\n') 
     ++nc; 
    printf("%ld\n", nc); 
    return 0; 
} 
+0

не используют '^ X' в unix, поскольку он используется в tty-драйвере для отправки' SIGSTOP' в терминальные процессы и столкнется с символом 'EOF'. Также в приготовленном режиме unix всегда распознает '^ D' как EOF, без необходимости использовать ввод до после (однако ** он не распознается ** в сыром режиме). Случается, что один '^ D' делает чтение без возврата, а иногда вам понадобится второй'^D', чтобы сделать ** read (2) ** системный вызов возвращать 0 символов ('EOF' в unix распознается как 0 символов). –

+0

@ Luis, CTRL-X был всего лишь примером, чтобы показать, как его изменить, с соответствующим предупреждением о возможном отключении терминала. – paxdiablo

0

EOF Working

Запишите свои входы и нажмите Enter затем Ctrl + Z для Windows, и ctrl + d для Unix, затем нажмите Enter. То же самое можно увидеть в изображении, прикрепленном мной. Это определенно.

Смежные вопросы