web-dev-qa-db-fra.com

En C, une longue instruction printf peut-elle être divisée en plusieurs lignes?

J'ai la déclaration suivante:

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

Je veux rompre. J'ai essayé ce qui suit mais ça ne marche pas.

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

Comment puis-je le casser?

76
neuromancer

Si vous souhaitez séparer un littéral de chaîne en plusieurs lignes, vous pouvez concaténer plusieurs chaînes, une sur chaque ligne, comme suit:

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

Juste quelques autres options de formatage:

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

Vous pouvez ajouter des variations sur le thème. L'idée est que les speficiers de conversion printf() et les variables respectives sont tous alignés "joliment" (pour certaines valeurs de "joliment").

20
pmg

Le compilateur C peut coller des littéraux de chaîne adjacents en un seul, comme

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

Le préprocesseur peut utiliser une barre oblique inversée comme dernier caractère de la ligne, sans compter le CR (ou le CR/LF, si vous êtes originaire de Windows):

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

Je ne pense pas que l'utilisation d'une instruction printf pour imprimer des littéraux de chaîne, comme indiqué ci-dessus, soit une bonne pratique de programmation; au lieu de cela, on peut utiliser le morceau de code ci-dessous:

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

La méthode standard de facto pour scinder les fonctions complexes en C est par argument:

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

Ou si vous voulez:

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

Vous ne devriez pas séparer la chaîne, vous ne devriez pas utiliser \ pour casser une ligne C. Un tel code devient rapidement complètement illisible/incontrôlable.

3
Lundin