隐藏的可打印文本
Hidden printable text
我构建了一个小程序,只需将文本从 input.txt
文件复制到 output.txt
文件。它与命令没有明显问题:
./myCopier.txt < rand.txt > randout.txt
在 GCC89 编译器上,用于教学目的。
#include<stdio.h>
int main(void){
int c;
while ((c = getchar()) != EOF)
putchar(c);
/*The text in printf() does not appear anywhere*/
printf("My theories and toughts!\n");
}
稍后,我添加 printf()
以打印我对程序工作原理的看法。即使使用限制性参数 (-Wall
),它也可以无错误或警告地编译,但此文本不会出现在任何地方。在任何地方,我的意思是 output.txt
和标准输出。
我在想:
- 命令
./myCopier.exe
显然会造成无限循环。没有文本输入就没有 EOL
字符,因此永远不会到达 print()
命令。
- 那么,为什么在提供输入的时候,
printf()
命令没有明显的效果呢?我希望 printf()
中的文本出现在标准输出中,就在循环结束并创建 output.txt
时。为什么没有发生?
- 我的理论是
./myCopier.txt < rand.txt > randout.txt
不允许。由于某种原因,它使得程序只将输入传输到输出,"ignoring" 一切都不是来自输入。我对么?如果是,为什么?
如果您对问题更深入的细节感兴趣,这里是汇编代码:
在 main() 中省略 return 语句会导致 C89/C90 中出现未定义的行为。
通常,return从 main() 调用会强制刷新输出缓冲区。如果省略 return 语句,任何事情都可能发生。
- 尝试按照 C90 的要求在 main() 的末尾添加
return 0
。 c90/gnu90 模式下的 GCC 将以其他方式警告您:"control reaches end of non-void function".
- 尝试添加
fflush(stdout);
.
我构建了一个小程序,只需将文本从 input.txt
文件复制到 output.txt
文件。它与命令没有明显问题:
./myCopier.txt < rand.txt > randout.txt
在 GCC89 编译器上,用于教学目的。
#include<stdio.h>
int main(void){
int c;
while ((c = getchar()) != EOF)
putchar(c);
/*The text in printf() does not appear anywhere*/
printf("My theories and toughts!\n");
}
稍后,我添加 printf()
以打印我对程序工作原理的看法。即使使用限制性参数 (-Wall
),它也可以无错误或警告地编译,但此文本不会出现在任何地方。在任何地方,我的意思是 output.txt
和标准输出。
我在想:
- 命令
./myCopier.exe
显然会造成无限循环。没有文本输入就没有EOL
字符,因此永远不会到达print()
命令。 - 那么,为什么在提供输入的时候,
printf()
命令没有明显的效果呢?我希望printf()
中的文本出现在标准输出中,就在循环结束并创建output.txt
时。为什么没有发生? - 我的理论是
./myCopier.txt < rand.txt > randout.txt
不允许。由于某种原因,它使得程序只将输入传输到输出,"ignoring" 一切都不是来自输入。我对么?如果是,为什么?
如果您对问题更深入的细节感兴趣,这里是汇编代码:
在 main() 中省略 return 语句会导致 C89/C90 中出现未定义的行为。
通常,return从 main() 调用会强制刷新输出缓冲区。如果省略 return 语句,任何事情都可能发生。
- 尝试按照 C90 的要求在 main() 的末尾添加
return 0
。 c90/gnu90 模式下的 GCC 将以其他方式警告您:"control reaches end of non-void function". - 尝试添加
fflush(stdout);
.