c - ((c=getchar())!=EOF) 和 ((c=getchar())!='~' ) 之间的区别 ,'~' 可以是任何字符

标签 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) 必须是新行中终止 while 循环的第一个字符? 这与getchar()和EOF(ctr+Z)的工作有关

最佳答案

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

在 DOS 下编写编辑器的人决定在行首键入 ^Z 是告诉编辑器您已完成输入的方式。

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

事实上,你的例子...

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

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

关于c - ((c=getchar())!=EOF) 和 ((c=getchar())!='~' ) 之间的区别 ,'~' 可以是任何字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24453432/

相关文章:

c - fgetc,检查 EOF

C++ EOF Getline 错误

c - K&R 练习 1-9 C 编程解决方案

c - 写套接字导致 C 中的 "program exited with code 141"

c - Linux 共享库的问题

bison - 在输入文件中到达 EOF 时如何做某事?

c - 在c中输入 float 时如何进行错误检查?

c - 如何在 EOF 后停止读取值

c - 来自 files.c 的 "mind map"生成器

c - 加载二进制文件 - realloc() : invalid next size