((c = getchar())!= EOF)和((c = getchar())!='〜')之间的差异,'〜'可以是任何字符

时间:2014-06-27 13:47:21

标签: c eof getchar

一旦遇到“〜”,之后的任何内容都不会被打印出来并且控制权出来 while循环

while((c = getchar()) != '~')
{
    putchar(c);
    printf(" ");
}
input: asdf~jkl
output: a s d f   //control is out of while loop

遇到“^ Z”时,之后的任何内容都不会被打印,但控件不会出现在while循环中

while((c = getchar()) != EOF)
{
    putchar(c);
    printf(" ");
}
input: asdf^Zjkl
output a s d f ->   //control is still inside while loop

请解释为什么会这样? 一旦遇到EOF,while循环必须退出,但这不会发生。 是否必须(ctrl + Z)必须是新行的第一个字符才能循环终止? 这与getchar()和EOF(ctr + Z)

的工作有关

1 个答案:

答案 0 :(得分:2)

这是控制台输入编辑器在Windows / DOS命令提示符下的工作方式。输入是逐行完成的,这就是为什么你可以来回编辑字符,直到你按下ENTER,然后该行的内容被发送到程序并开始一个新行。

在DOS下编写编辑器的人决定在行的开头键入^ Z是告诉编辑你已完成输入的方法。

问题是EOF(文件末尾)是虚拟标记,并不总是真正的字符。它的实际值(-1)表明超出了字符代码的范围(这也是为什么在调用int时使用char变量而不是getchar()的重要性。 fgetc())。

事实上,你的例子......

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

...如果您使用输入重定向(“program.exe< input.txt”)运行程序,以便在中间为^ Z提供文件,则可以按预期工作。在这种情况下,路上没有命令行编辑器。