正如标题所暗示的那样,如果我用C ++执行此操作,打印的意思是什么:
printf("one\0two");
?当我这样做时,GCC给了我一个警告,但是Visual Studio很好用。他们的工作方式有所不同吗?考虑一下,我希望printf停在第一个\ 0,但显然使用它的代码在Windows上一直运行到现在为止,所以我不确定。
答案 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
这样的函数的参数,并且会在没有警告的情况下通过狡猾的论证。