В Си длинный оператор printf может быть разбит на несколько строк? - PullRequest
73 голосов
/ 18 ноября 2009

У меня есть следующее утверждение:

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

Как мне его разбить?

Ответы [ 5 ]

150 голосов
/ 18 ноября 2009

Если вы хотите разбить строковый литерал на несколько строк, вы можете объединить несколько строк по одной в каждой строке, например:

printf("name: %s\t"
"args: %s\t"
"value %d\t"
"arraysize %d\n", 
sp->name, 
sp->args, 
sp->value, 
sp->arraysize);
19 голосов
/ 18 ноября 2009

Просто некоторые другие параметры форматирования:

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() и соответствующие переменные выстроены в очередь «красиво» (для некоторых значений «красиво»).

17 голосов
/ 18 ноября 2009

Компилятор C может склеивать соседние строковые литералы в один, например

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

Препроцессор может использовать обратную косую черту в качестве последнего символа строки, не считая CR (или CR / LF, если вы из Windowsland):

printf("foo %s \
bar: %d", foo, bar);
3 голосов
/ 11 августа 2016

Де-факто стандартный способ разбиения сложных функций в 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 голосов
/ 11 августа 2016

Я не думаю, что использование одного оператора 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...