2016-08-22 3 views
-3

Я создал программу на своем ПК под управлением Windows XP с помощью Dev-C++ 5.11. Это тот, который я видел, как типичная программа подсчета символов и выглядит следующим образом:Программа подсчета символов не работает так, как должна

#include <stdio.h> 

main() { 
    long nc; 
    nc = 0; 
    while (getchar() != EOF) { 
     ++nc; 
    } 
    printf("%ld", nc); 
} 

Составлен без проблем, но он работает, как он должен ТОЛЬКО тогда, когда среди персонажей жму я включаю кнопку ввода (\n) , Если я его не напечатаю 0 или ничего вообще. Я попытался включить другие символы, такие как вкладка или backspace, но все равно ничего. Я использую ctrl + c для его завершения. Что я делаю не так?

+2

Возможный дубликат [while ((c = getchar())! = EOF) Не завершается] (http://stackoverflow.com/questions/18565663/while-c-getchar-eof-not-terminating) –

+1

Возможно, это не работает «как должно», но работает только так, как только может, поскольку вы используете функцию getchar(), которая ждет «кнопку ввода» –

+0

@DarkoDjuric: 'getchar()' не ждет «enter», он ожидает ввода фактического появления на 'stdin'. Эти две вещи очень разные. – DevSolar

ответ

0

буферного вход.

Когда вы вводите ввод, он получает буферизацию терминала (cmd.exe, xterm, что угодно). На данный момент ваша программа по-прежнему не «видит» какой-либо из этих данных. Только после того, как вы нажмете enter, терминал отправляет содержимое буфера в вашу программу.

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

0

Ваша программа должна работать нормально. Попробуйте запустить его с помощью перенаправления в него файл как:

myprogram < somefile 

Проблема вы наблюдаете происходит от обработки конца файла с помощью терминала. Вы сигнализируете о конце файла, введя Ctrl-Z<enter> в Windows и Ctrl-D в Unix.

Однако обратите внимание, что вы должны написать программу таким образом:

#include <stdio.h> 

int main(void) { 
    long nc; 
    nc = 0; 
    while (getchar() != EOF) { 
     ++nc; 
    } 
    printf("%ld\n", nc); 
    return 0; 
} 
0

getchar() считывает до EOF; поэтому вы не увидите вывод printf() до тех пор, пока цикл while не завершится (то есть, когда функция getchar() вернет EOF).

Для того, чтобы отправить EOF, вы можете нажать CTRL + D. Попробуйте ввести текст в свой ввод, а затем нажмите CTRL + D и посмотрите, работает ли это. По крайней мере, в UNIX/OS X это отправит EOF. Вы также можете сравнивать символы, и если нажата определенная клавиша, вы выходите из цикла и видите свой счет.

Если вы подключаетесь к выходу другой программы, то это должно работать нормально, поскольку оно получит EOF после того, как выход будет завершен в него. Например, файл cat | ./counterprogram

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