主题:printf函数问题
zzpfenfei
[专家分:0] 发布于 2011-02-18 18:41:00
如题,问下printf函数格式问题
#include <stdio.h>
void main()
{
int a=1,b=2,c=3;
printf("%d" "%d" "%d" "\n",a,b,c);
}
上述程序输出123,这跟平时我们的写法有点不同
我们平时用的printf形式语句是
printf("%d,%d,%d",a,b,c);//
ok,上述形式可以理解但是奇怪的是
如果我们有
#include <stdio.h>
void main()
{
int a=1,b=2,c=3;
printf("%d" , "%d" "%d" "\n",a,b,c);
}
注意,比第一段程序多了一个逗号,但是编译依然通过,但是结果是输出了4337572,各位大侠,这是为什么啊?
回复列表 (共6个回复)
沙发
fragileeye [专家分:1990] 发布于 2011-02-18 19:57:00
这个我不清楚,表示很期待牛人准确答复、、
顺便说说我的想法:
printf主要是将a,b,c入栈,而开始输出时从第一个%d开始(因为中间的逗号的缘故),接着后面的两个%d没有需要输出的变量与之对应,这就造成了溢出,我的编译器得到的是4206592。。
仅是猜想,菜鸟学习中、
板凳
zzpfenfei [专家分:0] 发布于 2011-02-18 20:12:00
第一种输入格式有点诡异,两个“%d”之间无论隔着多少个空格,最后得到的输出格式都是一样的,c预言书上,貌似没找到这种定义???
3 楼
windy0will [专家分:2300] 发布于 2011-02-18 21:09:00
C标准有这样一项:"abc" "def"会自动连成"abcdef",这样是有好处的。如可以把一个字符串分两行或多行写,其中间可隔任意多空白字符,这样增加代码的可读性。但是"%d","%d"不会连成一个字符串。
在printf("%d" , "%d" "%d" "\n",a,b,c)中当成不同的参数。这里,会把字符串"%d%d\n"的地址当成一个整数传给前面的"%d",后面的参数a,b,c由于缺少格式"%d"而不能输出。字符串中的%和普通字符没区别,它只在特殊的函数才有特殊的意义,如scanf printf等。在C99标准中明确规定这样的代码编译器要能给出警告的(编译器要检查有些库函数的参数)。
4 楼
fragileeye [专家分:1990] 发布于 2011-02-18 22:39:00
每次看您的回帖都受益匪浅!!
对啊,我怎么没想到是串的地址呢!!!向您学习!
5 楼
zzpfenfei [专家分:0] 发布于 2011-02-19 01:21:00
看了你的回复,明白很多,谢谢
6 楼
bruceteen [专家分:42660] 发布于 2011-02-19 11:17:00
windy0will 讲得好啊,我来举个例子
const char* str = "000000001\n000000002\n000000003\n……";
const char* str = "000000001\n"
"000000002\n"
"000000003\n"
……;
const char* str = "000000001\n\
000000002\n\
000000003\n\
……;
cont char* str = "000000001
000000002
000000003
……;
前三者是等价的,但第一种形式,字符串不能太长,因为C/C++对每行的字节数有限定
第三种形式,每行之前不能存在空格或TAB来对齐其,因为它们都会被包含在字符串中
第四种形式,和第三种的缺点一样。另外,如果文件格式和输出格式不一样,其结果也就错误了。
我来回复