web-dev-qa-db-ja.com

Cでは、長いprintfステートメントを複数の行に分割できますか?

私は次の声明を持っています:

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

どうすれば分割できますか?

76
neuromancer

文字列リテラルを複数の行に分割する場合は、次のように、各行に1つずつ、複数の文字列を連結できます。

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

いくつかの他のフォーマットオプション:

_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()変換スペシフィアとそれぞれの変数がすべて「きちんと」並んでいるということです(「きちんと」のいくつかの値に対して)。

20
pmg

Cコンパイラは、次のように、隣接する文字列リテラルを1つに接着できます。

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

プリプロセッサは、CR(またはWindowslandの場合はCR/LF)をカウントせずに、行の最後の文字としてバックスラッシュを使用できます。

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

上記のように1つの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); 
3
antoine maboula

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
Lundin