【问题标题】:In C can a long printf statement be broken up into multiple lines?在 C 中可以将长 printf 语句分成多行吗?
【发布时间】:2010-12-17 15:33:31
【问题描述】:

我有如下声明:

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);

我怎样才能打破它?

【问题讨论】:

  • 给出了一些很好的建议,但它们都不像四个单独的 printf() 调用那样清晰或可维护。
  • @Clifford:那么你可以编写 C++,这样 cout 看起来更适合你。

标签: c printf


【解决方案1】:

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

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

【讨论】:

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

只是一些其他格式选项:

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() 转换指定器和相应的变量都“很好”排列(对于“很好”的某些值)。

【讨论】:

  • 这里没有任何功能,但是我以前从未见过的新颖想法。我喜欢它,很棒的评论@pmg!
【解决方案3】:

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

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

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

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

【讨论】:

  • 第一个已经被建议了,第二个的问题是如果在'\'之后有任何空格,它就会中断;发生时可能会令人困惑的错误。
  • 这两个示例都与 C 预处理器没有任何关系。
  • @Dan 我的 cpp 似乎理解 / (见我上面的编辑)。我不确定这是否是标准行为。
  • @Dan 虽然可以使用预处理器或编译器(在实际编译之前的最后阶段)执行连接相邻的文字,但处理行继续是由预处理器执行的,因为否则无法实现多行宏。另请参阅此处 - gcc.gnu.org/onlinedocs/cpp/Initial-processing.html
  • @qrdl:我的错,你说的第二个是对的。行继续总是由预处理器完成。有时我需要提醒我,我 不是 无所不知;)我仍然认为,在正常情况下,编译器会加入字符串文字。
【解决方案4】:

我不认为使用一个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); 

【讨论】:

    【解决方案5】:

    在 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 行。这样的代码很快就会变得完全不可读/不可维护。

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 2020-09-26
      • 1970-01-01
      • 2021-12-03
      • 2022-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      相关资源
      最近更新 更多