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

neu*_*cer 79 c printf

我有以下声明:

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

我想打破它.我尝试了以下但它不起作用.

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

我怎么能分手呢?

Jam*_*lis 160

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

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

  • 只是评论解释一个鲜为人知的C事实,即两个字符串之间的空格是连接. (83认同)
  • @Lundin将每个变量及其值清楚地表示在自己的行上对我来说更容易阅读.您能想象IDE中的调试器将所有变量和值放在一行吗?我不能._(是的,我知道它不会在每个字符串之间添加换行符,但我将源代码的可读性与调试器中变量的可读性进行比较)_ (2认同)
  • 这个串联是由预处理器完成的吗? (2认同)

pmg*_*pmg 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);
Run Code Online (Sandbox Code Playgroud)

您可以在主题上添加变体.这个想法是printf()转换speficiers和各自的变量都"很好地"排列(对于某些"很好"的值).


qrd*_*rdl 19

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

printf("foo: %s "
       "bar: %d", foo, bar);
Run Code Online (Sandbox Code Playgroud)

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

printf("foo %s \
bar: %d", foo, bar);
Run Code Online (Sandbox Code Playgroud)

  • 第一个已被建议,第二个是因为如果在'\'之后有任何空格*,它就会中断; 一个错误,当它发生时可能会莫名其妙. (6认同)
  • @qrdl:我的不好,你对第二个是正确的.线路延续始终由预处理器完成.有时我需要提醒我,我不是*知道所有;)我仍然认为在正常情况下编译器会加入字符串文字. (2认同)

Lun*_*din 5

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

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

或者,如果您愿意:

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

您不应该拆分字符串,也不应该使用\中断 C 行。这样的代码很快就变得完全不可读/不可维护。