2011-07-15 93 views
3
#include <stdio.h> 

// copy input to output 
// my version 

int main() 
{ 
    int c; 

    printf("\n\nUse CONTROL + D to terminate this program\n\n"); 

    while ((c = getchar()) != EOF) { 
     putchar(c); 
    } 

    if ((c = getchar()) == EOF) { 
     printf("\n\nProgram TERMINATED\n\n"); 
    } 

    return 0; 
} 

获取输入当我进入控制 + d,该if语句运行的机构。这就是我想要的,但是当我更彻底地分析代码时,不应该再次询问我的输入,因为if的条件是(c = getchar()) == EOF在if条件

+0

为什么'int'而不是'char'? – alex

+0

@alex:因为'getchar'返回一个'int'(实际上是一个'unsigned char'转换为'int'或者'EOF' - 根据定义它是一个负数)。 – jweyrich

回答

2

当您点击^D时,程序输入被关闭,因此getchar()随后将始终返回EOF

+0

那么如果每次调用'getchar()'在'^ D'之后都不起作用,我该如何再次输入? – Espresso

+0

使用除'^ D'(和随后的文件结尾)以外的内容来终止您的输入。 – duskwuff

0

^D立即终止程序。因此,当^ D被击中时,你是getchar永远不会返回的。

这就是为什么REPL像python退出使用'exit()'。

如果你想,尝试使用 'Q' 为在quiting:

+4

这可能表达得更好 - '^ D'通常不会终止程序,只是它们的输入。该计划可以随意忽略缺乏投入并继续其快乐的方式。 – Cascabel

1

控制-d是规范模式结束文件字符。当在一行的开头处输入时,它会导致进程看到EOF条件,即读取返回0.但是,如果如果Control-D进入除行开头之外的某处,它只会导致读取立即返回迄今已输入的内容。

如果你连续两次击中Control-D,你应该看到我想问你的问题。

编辑

Here是一个相当不错的解释。