奇怪的C fprintf格式表示法

时间:2012-05-14 14:51:13

标签: c printf format-specifiers

当我注意到这段代码时,试图找出函数中的堆栈损坏错误:

fprintf( fp, "\n%s %3c %12s %2c %12s %2c %12s %2c %12s %2c"
             "%12s %2c %12s", 
             xys_field[3],      x,
             xyzFunc(val1, 0),  x, 
             xyzFunc(val2, 0),  x, 
             xyzFunc(val3, 0),  x,
             xyzFunc(val4, 0),  x, 
             xyzFunc(val5, 0),  x, 
             xyzFunc(val6,0) );

我问的是关于这一行"\n%s %3c %12s %2c %12s %2c %12s %2c %12s %2c" "%12s %2c %12s",我甚至不明白这是如何编译的,因为我从未见过两种格式如此相互跟随。谢谢你的帮助。

3 个答案:

答案 0 :(得分:6)

这些不是两种格式 - 注意没有逗号,或者除了空格之外的任何东西。这是用于延续长字符串的C语法。在C中,这些是等价的:

"abc" "def"
"abcdef"

请注意,这仅适用于字符串文字;你不能连接字符串变量。这是语法错误:

string1 string2

答案 1 :(得分:2)

在C中,并列的字符串文字(中间只有空格)表示单个字符串:

int main()
{
    puts("Hello, " "world!");
    return 0;
}

打印Hello, world!

答案 2 :(得分:1)

这与格式说明符无关,而与C有关的所有内容都允许您拆分string literal into multiple parts(例如,为了清晰起见,跨行)并将其连接起来。