Я пытаюсь понять, как работает драйвер терминала в связке с getchar. Вот несколько примеров кода, которые я написал, читая KandR:
Код 1:
#include <stdio.h>
int main(){
int c = getchar();
putchar(c);
return 0;
}
Код 2:
#include <stdio.h>
int main(){
int c = EOF;
while((c=getchar()) != EOF){
printf("%c",c);
}
return 0;
}
Код 3: // базовая программа, которая эмулирует функциональность команды wc
#include <stdio.h>
#define IN 1
#define OUT 0
int main(){
//nc= number of characters, ns = number of spaces, bl=number of newlines, nw=number of words
int c = EOF,nc=0,nw=0,ns=0,nl=0, state = OUT;
while((c=getchar())!=EOF){
++nc;
if(c=='\n'){
++nl;
state = OUT;
}
else if(c==' '){
++ns;
state = OUT;
}
else{
if(state == OUT){
state = IN;
++nw;}
}
}
printf("\n%d %d %d %d",nc,nw,ns,nl);
return 0;
}
Я хочу понять, когда драйвер терминала фактически передает входную строку программе. Предположим, что я ввел строку «это тест», и я нажимаю ввод, тогда вот как работают вышеупомянутые коды:
код 1: выводит "t" (и программа завершается)
код 2: выводит «это тест», переходит к следующей строке (потому что он также выводит ввод, который я нажал) и снова ждет ввода.
код 3: ничего не выводит для приведенной выше строки, за которой следует ввод. Мне нужно нажать Ctrl+D для отображения вывода (выход 15 4 3 1)
1) Почему в случае кода 3 мне нужно явно нажимать Ctrl+D (EOF) для отправки ввода в мою программу? Другими словами, почему моя входная строка была отправлена в мою программу в случае кода 1 и кода 2 после того, как я нажал клавишу ввода? Почему он также не запросил EOF?
2) Кроме того, в случае кода 3, если я не нажимаю ввод после входной строки, мне нужно дважды нажать Ctrl + D для отображения вывода. Почему это так?
ИЗМЕНИТЬ:
Для другого ввода скажите «ТЕСТИРОВАНИЕ ^ D», вот как работают приведенные выше коды:
1) выводит "Т" и заканчивается
2) выводит «ТЕСТИРОВАНИЕ» и ждет дополнительных входных данных
3) ничего не выводит, пока не будет нажата другая Ctrl+D. затем он выводит 7 1 0 0.
В случае этого ввода драйвер терминала отправляет входную строку в программу при получении Ctrl+D в случае кода 1 и кода 2. Означает ли это, что /n и Ctrl+D обрабатываются одинаково, т.е. они оба служат маркер для драйвера терминала для отправки ввода в программу? Тогда почему мне нужно дважды нажать Ctrl+D для второго случая?
Это http://en.wikipedia.org/wiki/End-of-file говорит, что драйвер преобразует Ctrl+D в EOF, когда он находится на новой строке. Но в случае моего ввода «ТЕСТИРОВАНИЕ ^ D» он работает нормально, даже если ^ D находится в той же строке, что и остальная часть ввода. Какое может быть возможное объяснение этому?
ctrl
+d
отправляетEOF
, если буфер терминала сбрасывается, а в противном случае сбрасывает буфер. Новая строка также очищает буфер. К сожалению, я не могу найти ссылку на это в данный момент. ХТН - person mafso   schedule 15.06.2014