如果我做printf会发生什么(“一个\ 0两个”);?

时间:2011-05-18 23:28:41

标签: c++ visual-studio printf

正如标题所暗示的那样,如果我用C ++执行此操作,打印的意思是什么:

printf("one\0two");

?当我这样做时,GCC给了我一个警告,但是Visual Studio很好用。他们的工作方式有所不同吗?考虑一下,我希望printf停在第一个\ 0,但显然使用它的代码在Windows上一直运行到现在为止,所以我不确定。

4 个答案:

答案 0 :(得分:8)

你会得到:

$ a.out
one$

\0为空并结束字符串。没有新行。

$ cat try.c
#include <stdio.h>

int
main(){
    printf("one\0two");
    return 0;
}
542 $ gcc try.c
try.c: In function ‘main’:
try.c:5: warning: embedded ‘\0’ in format
543 $ ./a.out
one544 $ 

答案 1 :(得分:5)

C样式字符串以null结尾。因此,在打印字符串时,它会将所有内容打印到第一次出现的空字符。在这种情况下,它应该打印one而不打印任何其他内容。

答案 2 :(得分:4)

你打印出“一个” - 后面没有换行符。

您还会收到编译器警告。

海湾合作委员会很友善 - 让你知道'两个'是无关紧要的。 你也不应该使用使用printf()的格式字符串中没有%标记是没有意义的......你可以使用puts()或{ {1}}而是。出于安全原因,不要使用用户可以选择的格式字符串至关重要:fputs()

MSVS没有给你警告;编译器没有义务建议修改代码的方法。

答案 3 :(得分:2)

printf确实会停留在嵌入的“null”字符处,只打印“one”。

GCC发出警告,因为像这样的格式字符串很可能是错误的;它还会将格式字符串与参数类型进行比较,并在它们不匹配时发出警告。其他编译器并没有花费太多精力来分析像printf这样的函数的参数,并且会在没有警告的情况下通过狡猾的论证。