在C语言中,长的printf语句可以分成多行吗?


86

我有以下声明:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", sp->name, sp->args, sp->value, sp->arraysize);

我想分手。我尝试了以下操作,但不起作用。

printf("name: %s\t
args: %s\t
value %d\t
arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize);

我该如何分解?


1
给出了一些很好的建议,但是它们都不像四个单独的printf()调用那样清晰或可维护。
克利福德,

@Clifford:那么您可以编写C ++,因此cout对您来说更好。
测试

Answers:


173

如果要将字符串文字分解为多行,可以将多个字符串连接在一起,每行一个,如下所示:

printf("name: %s\t"
"args: %s\t"
"value %d\t"
"arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize);

85
我只是评论解释一下鲜为人知的C事实,即两个字符串之间的空格是串联的。
布赖恩·波斯托

2
@Lundin对我来说,将每个变量及其值清楚地表示在自己的行上非常容易。您能想象在IDE中将所有变量和值放在一行中的调试器吗?我不能 (是的,我知道它不会在每个字符串之间放置换行符,但是我正在将源代码的可读性与调试器中变量的可读性进行比较)
byxor

这是由预处理程序进行的吗?
首次亮相

21

C编译器可以将相邻的字符串文字粘合为一个,就像

printf("foo: %s "
       "bar: %d", foo, bar);

预处理程序可以将反斜杠用作行的最后一个字符,而不计算CR(如果您来自Windowsland,则不计算CR(或CR / LF)):

printf("foo %s \
bar: %d", foo, bar);

6
第一个已经被提出,第二个遭受的事实是如果'\'后面有空格,它会中断;一个可能会令人困惑的错误。
克利福德

1
这两个示例都与C预处理器毫无关系。
Dan Molding

@Dan我的cpp似乎理解/(请参阅上面的编辑)。我不确定这是否是标准行为。
sigjuice

@Dan虽然可以使用预处理器或编译器(在实际编译之前的最后阶段)执行连接相邻文字的操作,但处理行的连续性由预处理器执行,因为否则将无法实现多行宏。在此还看到- gcc.gnu.org/onlinedocs/cpp/Initial-processing.html
qrdl

2
@qrdl:我不好,您对第二个没错。行继续始终由预处理器完成。有时需要提醒我,我不是万能的;)我仍然认为在正常情况下,编译器会连接字符串文字。
Dan Molding

20

只是一些其他格式选项:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
        a,        b,        c,        d);

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
              a,        b,        c,            d);

printf("name: %s\t"      "args: %s\t"      "value %d\t"      "arraysize %d\n", 
        very_long_name_a, very_long_name_b, very_long_name_c, very_long_name_d);

您可以在主题上添加变体。这个想法是printf()转换专用变量和各个变量都全部“很好地”排列(对于“ nicely”的某些值)。


这里没有任何功能,但是我从未见过的新颖想法。我喜欢,很棒的评论@pmg!
rpj

3

事实证明,在C中拆分复杂函数的标准方法是每个参数:

printf("name: %s\targs: %s\tvalue %d\tarraysize %d\n", 
       sp->name, 
       sp->args, 
       sp->value, 
       sp->arraysize);

或者,如果您会:

const char format_str[] = "name: %s\targs: %s\tvalue %d\tarraysize %d\n";
...
printf(format_str, 
       sp->name, 
       sp->args, 
       sp->value, 
       sp->arraysize);

您不应拆分字符串,也不应使用它\来破坏C行。这样的代码很快就会变得完全无法阅读/无法维护。


3

我认为printf,如上所述,使用一个语句来打印字符串文字并不是一种好的编程习惯;相反,可以使用下面的代码:

printf("name: %s\t",sp->name);
printf("args: %s\t",sp->args);
printf("value: %s\t",sp->value);
printf("arraysize: %s\t",sp->name); 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.