【发布时间】:2021-12-13 23:54:30
【问题描述】:
我正在阅读 Brian Kernighan 的 Programming in C - A Tutorial,他在第 5 页上建议
main( ) {
char c;
while( (c=getchar( )) != ′\0′ )
putchar(c);
}
可以简化为
main( ) {
while( putchar(getchar( )) != ′\0′ ) ;
}
唯一的区别是最后一个'\0' 打印在第二个。
但是,当我编译它时,将 '\0' 替换为 EOF,并传递一个字符串:$ printf "abc" | ./a.out,程序进入一个无限循环,打印 ASCII 0xff 字符。
如果我将其更改为while( putchar(getchar( )) != 'd' ) ; 并运行$ printf "abcde" | ./a.out,它会成功打印到d(包括d),然后退出。
为什么它会进入无限循环而不是打印abc(EOF) 并退出?
【问题讨论】:
-
Dude - "EOF" "\0'!如果你查看 stdio.h,你会看到它是 "-1"。问:如果你只是逐字复制示例,一切正常吗?
-
我用 '\0' 和 -1 (没有引号)都试过了。一旦它到达 EOF(^D、文件描述符结尾、字符串结尾等),它就会开始发送垃圾邮件 0xff。
-
替代代码:
int main( ) { int c; while( (c=getchar( )) != EOF ) putchar(c); } }
标签: c