我试图了解终端驱动程序如何与 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 的情况下,如果我在输入字符串后不按 enter,我需要按 Ctrl+D 两次才能显示输出。为什么会这样?
编辑:
对于另一个输入说“TESTING^D”,上面的代码是这样工作的:
1) 输出“T”并结束
2) 输出“TESTING”并等待更多输入
3) 在按下另一个 Ctrl+D 之前不输出任何内容。然后它输出 7 1 0 0。
在此输入的情况下,终端驱动程序在代码 1 和代码 2 的情况下收到 Ctrl+D 时将输入字符串发送给程序。这是否意味着 /n 和 Ctrl+D 的处理方式相同,即它们都用作终端驱动程序将输入发送到程序的标记?那么为什么我需要在第二种情况下按两次 Ctrl+D 呢?
这个http://en.wikipedia.org/wiki/End-of-file说驱动程序在换行时将 Ctrl+D 转换为 EOF。但是在我的“TESTING^D”输入的情况下,即使 ^D 与输入的其余部分在同一行上,它也可以正常工作。对此有什么可能的解释?