回 帖 发 新 帖 刷新版面

主题:printf函数问题

如题,问下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个回复)

沙发

这个我不清楚,表示很期待牛人准确答复、、

顺便说说我的想法:

printf主要是将a,b,c入栈,而开始输出时从第一个%d开始(因为中间的逗号的缘故),接着后面的两个%d没有需要输出的变量与之对应,这就造成了溢出,我的编译器得到的是4206592。。

仅是猜想,菜鸟学习中、

板凳

第一种输入格式有点诡异,两个“%d”之间无论隔着多少个空格,最后得到的输出格式都是一样的,c预言书上,貌似没找到这种定义???

3 楼

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 楼


每次看您的回帖都受益匪浅!!
对啊,我怎么没想到是串的地址呢!!!向您学习!

5 楼

看了你的回复,明白很多,谢谢

6 楼

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来对齐其,因为它们都会被包含在字符串中
第四种形式,和第三种的缺点一样。另外,如果文件格式和输出格式不一样,其结果也就错误了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册