В C можно ли разбить длинный оператор printf на несколько строк?



у меня есть следующее заявление:



printf("name: %stargs: %stvalue %dtarraysize %dn", sp->name, sp->args, sp->value, sp->arraysize);


Я хочу разбить его. Я попробовал следующее, но это не работает.



printf("name: %st
args: %st
value %dt
arraysize %dn",
sp->name,
sp->args,
sp->value,
sp->arraysize);


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

933   5  

5 ответов:

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

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

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

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

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

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

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

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

де-факто стандартный способ разделения сложных функций в 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. Такой код быстро становится совершенно нечитаемым / недостижимым.

Я не думаю, что с помощью одного 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); 

Comments

    Ничего не найдено.