使用puts()和printf()函数时出现意外输出

时间:2014-12-10 08:12:15

标签: c

我试图在我的Dev C ++ IDE上运行基本代码,但它提供了预期的输出 -

printf("%d", printf("stackoverflow1"));
printf("%d", puts("stackoverflow2"));
puts(printf("stackoverflow3"));

预期输出应为:

  

stackoverflow114stackoverflow2

     

14stackoverflow314

但我得到的输出是:

  

stackoverflow114stackoverflow2

     

0stackoverflow3

有人可以解释输出中的不一致吗?我知道puts会返回一个非负数,但为什么我会得到一个' 0'每次。同样在最后一个声明中,为什么不打印printf打印的字符数?

3 个答案:

答案 0 :(得分:3)

    正如你所提到的,
  • puts()只需要在成功时返回非负数。这意味着您使用的编译器将决定返回的内容,只要它遵循此操作即可。您的编译器似乎选择了0。
  • 如2501所述,传递puts(const char * p)一个int是非法的,你的编译器应该抱怨它。 puts()应该从p开始打印,直到达到'\ 0'字符,因此输入必须是指向'\ 0'终止字符串的指针

答案 1 :(得分:2)

您有未定义的行为。 puts()收到const char*个参数,但您将其传递给int

puts(printf("stackoverflow3"));

在编译器上启用警告,您的代码甚至无法编译。

答案 2 :(得分:-1)

printf("%d", printf("stackoverflow1"));

Printf返回一个int(打印多少个字符= 14)。因为外部printf的参数必须在评估外部参数之前进行评估,所以打印的字符串将为“stackoverflow114”

printf("%d", puts("stackoverflow2"));

put返回一个“非负值”(这是标准给你的唯一保证)。在您的情况下,非负值为int 14.字符串“stackoverflow2 \ n”由puts打印,14由printf打印。

puts(printf("stackoverflow3"));

putsconst char*作为参数,printf返回打印的字符数(再次为14)。由于puts接受一个指针,它可以将地址14处的内存解释为字符串并输出它(它也可能取消编译 - 大多数编译器都会'高兴'并为你投这个,并附上警告) 。这个字符串似乎是空的(这可能是随机的)。因此,此行仅打印“stackoverflow3”(在您的情况下),外部仅打印一个随机字符串(在您的情况下为“”)。