隐藏的可打印文本

问题描述:

我构建了一个小程序,只需将文本从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和标准输出。

我想到:

  1. 命令./myCopier.exe单独明确创建一个无限循环。没有文本输入,没有EOL字符,因此print()命令永远不会到达。
  2. 那么,为什么当输入提供时,printf()命令没有明显的效果?我希望printf()的文本出现在标准输出上,只是在循环关闭时创建了output.txt。为什么不会发生?
  3. 我的理论是./myCopier.txt <rand.txt> randout.txt不允许。出于某种原因,它使得程序仅将输入传输到输出,“忽略”所有内容都不来自输入。我对么?如果是这样,为什么?

如果您有兴趣与更深层次的细节问题,这里是汇编代码:

http://text-share.com/view/79f31f38

+0

你能说明你的编译器生成了什么程序集吗? – Siguza

+1

另外,如果内存为我服务,那么在C99中引入了在main()中省略显式'return'语句的权限,这意味着通过C89标准,程序会调用未定义的行为。 – Siguza

+0

我认为在某个地方存在一些误解,那就是您认为发生的事实并非如此。第三点需要一些神奇的东西来做比较。也许你添加了'printf()',但之后未能重新编译并继续运行旧的二进制文件? – unwind

省略主return语句()导致C89/C90未定义行为。

通常情况下,从main()返回时会强制刷新输出缓冲区。如果您省略了退货声明,则可能发生任何事情。

  • 尝试在主()的末尾,如C90被要求添加return 0。否则,c90/gnu90模式下的GCC会发出警告:“控制到达非空功能结束”。
  • 尝试添加fflush(stdout);
+0

听起来不错,但是[OP在声明中声明](https://*.com/questions/44947173/hidden-printable-text#comment76869929_44947173)添加了'return'语句没有成功。可能OP是错误的,忘记与更改等编译... –

+0

@DavidBowling如果有一个显式的返回语句,程序需要刷新缓冲区,从而打印文本到标准输出(如果不是之前) 。如果没有,编译器不符合。 – Lundin

+0

同意,这也是我的第一个想法。只是指出OP的评论。 –