2015-03-16 4 views
0

Я занимаюсь домашней работой для своего класса программирования C. В вопросе говорится: «Напишите программу, которая читает ввод как поток символов, пока не встретит EOF». Я использую Xcode на моей macbook и единственный способ, которым я знаю, чтобы программа столкнулась с EOF, использует ctrl + D или ctrl + Z. Но она полностью завершит мою программу.выполнить после EOF в C

Например, у меня есть этот код:

int main() 
{ 
    int ch; 
    while ((ch = getchar()) != EOF) 
    { 
     putchar(ch); 

    } 
    printf("%d",ch); 
    return 0; 
} 

Есть ли прочь для кода, чтобы выполнить Е («% d», ч) после цикла (после того, как я ударил Ctrl + D на клавиатуре) ?

+1

Вам нужно нажать Enter хотя бы один раз, прежде чем нажать Ctrl-D. –

+0

@PaulGriffiths это действительно так? –

+0

@ dattran он должен печатать -1 или что-то в этом роде. вы уверены, что вам не хватает o/p из-за отсутствия '\ n' в заявлении на печать? –

ответ

0

Прежде всего ctrl+z не вводит EOF в вашу программу. Если вы нажмете ctrl+Z, ваша оболочка переведет вашу программу в режим сна.

Во-вторых, если вы хотите, чтобы обрабатывать эти ctrl+Z в вашей программе, вам нужно узнать об обработке сигнала в C.

И я думаю, потому что вы поражали ctrl+Z вы не видели никакого вывода на экран.

+3

OP, 'CTRL + Z' является' EOF' в Windows –

+0

@AlterMann: OP использует Mac. –

+1

'CTRL-D' является' EOF' на Unix и Mac OSX. В обработке 'CTRL-D' нет сигнала. – axiac

2

Вы можете протестировать свою программу, используя (с оболочкой POSIX) here documents.

Первый скомпилировать исходный код mycode.c в двоичный mybin с

gcc -std=c99 -Wall -Wextra -g mycode.c -o mybin 

(это может быть clang или cc вместо gcc)

затем запустить mybin с "здесь документ" как

./mybin << EOF 
    here is my 
    input 
EOF 

Вы также можете использовать перенаправление ввода. Запаситесь файл myfile.txt и запустить ./mybin < myfile.txt

Можно даже запустить программу на своем собственном исходном коде: ./mybin < mycode.c

И вход даже из какой-нибудь трубы, например, ls * | ./mybin

Кстати, вы наблюдаете за тем, что stdin, когда он является терминалом, буферизируется по строке. См. this answer (большинство из них должно применяться к MacOSX).

Обратите внимание, что ваш код некорректен: вы пропускаете #include <stdio.h> в верхней части файла, и ваш main должна быть действительно int main(int argc, char**argv) (BTW вы могли бы улучшить свою программу так, что, когда аргументы приводятся, они имена файлов, чтобы быть читать).Наконец окончание printf, несомненно, показывают, -1, который, как правило, значение EOF

Кроме того, это намного лучше закончить строку управления форматом printf с \n или же использовать надлежащим образом fflush(3)

Обратите внимание, что с истекшим -file является не входа (или действительным char), это условие на некотором входной файл поток, как stdin, а функция getchar(3) задаются для возврата EOF который является int вне диапазона char (на моем Linux системный tem EOF - -1, потому что char -s находятся между 0 и 255 включенными). Вы можете проверить конец-в-файл состояние после некоторых операций ввода (никогда раньше!) С помощью feof(3)

Терминала в обычном приготовленном режиме обрабатывается ядром так, что при нажатии Ctrl D конец файла условие запускается в файловом дескрипторе (часто STDIN_FILENO т.е. 0), относящемся к этому терминалу.

2

Я использую Xcode на своем macbook и единственный способ, которым я знаю, чтобы программа столкнулась с EOF, использует ctrl + D или ctrl + Z. Но она полностью завершит мою программу.

Нет, это не будет. Если вы запустите свою программу в отладчике Xcode, если панель консоли имеет фокус, все введенные вами типы будут отправлены в вашу программу (обратите внимание, что по умолчанию stdin является строковым буфером, поэтому вы будете видеть только вывод, когда вы нажимаете кнопку return key). Если вы нажмете control-d (not control-z), вы выйдете из цикла и распечатаете -1 в окне консоли (это то, что вы ожидаете, потому что это значение EOF в OS X).

Вот результат, когда я запустил программу без изменения в Xcode отладчика (я набрал команду-р в Xcode)

bgbgdfsfd
bgbgdfsfd
hgfdgf
hgfdgf
-1

Обычный шрифт был набран мной, жирный шрифт был из вашей программы. В конце каждой строки, набранной мной, я нажал на карету. После того, как ваша программа напечатана hgfdgf, я набрал control-D. Затем ваша программа напечатала значение последней вещи, полученной от getchar(), которая была EOF которая -1 в библиотеке OS X C.


Редактировать

Если вы не уверены, что ваша программа печатает EOF, изменить формат строки printf, чтобы (к примеру)

printf("Last character is [%d]\n", ch); 

Тогда вместо -1 ваш будет программа выход Last character is [-1] на последней строке.

+0

, так что если он получил EOF, он должен выйти из цикла и выполнить printf? Получили ли вы результаты печати? –

+0

@DatTran Да, это то, что '-1' находится в конце вывода. – JeremyP

0

Убедитесь, что вы посылаете сигнал EOF, а не сигнал, который фактически завершает вашу программу.

Например, для программы c, запущенной в окнах, EOF представляет, набрав ctrl + z и нажав enter. Выполнение этого приведет к выходу из цикла while, но все еще запускает остальную часть вашей программы.

Однако ctrl + c, который некоторые люди ошибочно пытались использовать для EOF, на самом деле убивает вашу программу и предотвратит выполнение кода, стоящего за вашим циклом while.

Для mac вам нужно будет найти вход, который соответствует EOF, и убедитесь, что это то, что вы отправляете, а не сигнал kill, который, как я подозреваю, является тем, что вы здесь делаете.

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