C concaténer une chaîne avec int in loop

Je suis nouveau sur C et j’ai des problèmes avec les chaînes. Ce que je voudrais faire est de créer une chaîne comme “val1, val2, val3” dans une boucle.

Actuellement, mon code ressemble à quelque chose comme:

char tagstr[60] = ""; int k; int n = 5; for (k=0; k < n; k++) { char temp[10] = ""; sprintf(temp, ", val%d", k); strcat(tagstr, temp); } 

Mais la sortie de tagstr est “, val #”, où # est une valeur entière longue. Je suppose que je fais quelque chose de mal avec les pointeurs ici, mais j’ai essayé tout ce à quoi je peux penser sans succès… toute aide serait très appréciée.

EDIT: plus de contexte, si cela aide:

 int tagsClosed = strlen(pch1) - strcspn(pch1, ")"); do { if (curTag.size > 0) { // problem section char tagstr[60] = ""; int k; for (k = 0; k  0); 

curTag est une structure:

 typedef struct Tag { char * name; int size; // number of children int tagnum; struct Tag* parent; } Tag; 

Le problème est que sprintf(temp, ", val%i", temp, k); ajoute la valeur de temp (qui est en fait l’adresse du premier caractère du tableau) à la chaîne, et n’ajoute pas la valeur de k à la chaîne. Cela devrait être sprintf(temp, ", val%i", k); .

Vous pouvez calculer la quantité d’espace dont vous avez besoin à l’avance (y compris zéro terminateur):

 5+1 + 5+1 + 5+1 + 5+1 + 5+1 + 1 = 31 characters 

Également; utiliser strcat est mauvais (pour la performance), car vous chercheriez à plusieurs resockets la fin de la tagstr , puis copiez les nouveaux caractères à la fin. Il serait préférable de garder la trace de la fin actuelle de tagstr et de stocker ensuite le groupe de caractères suivant directement à la fin, sans recherche, sans chaîne temporaire et sans copie. Par exemple:

 void thing(void) { char tagstr[60]; int pos = 0; int k; int n = 5; for (k=0; k < n; k++) { pos += sprintf(&tagstr[pos], ", val%d", k); } printf ("String is now: %s\n", tagstr); } 

Travaille pour moi:

 $ gcc -xc - && ./a.out int main(void) { char tagstr[60] = ""; int k; int n = 5; for (k=0; k < n; k++) { char temp[10] = ""; sprintf(temp, ", val%d", k); strcat(tagstr, temp); } printf("[%s]\n", tagstr); } [, val0, val1, val2, val3, val4] 

À moins que vous ne disiez que le problème vient de l'initiale ", " ..

votre tableau temporaire est trop court! utilisation

 char temp[16]; 

Si vous décidez que vous ne souhaitez pas que les virgules soient en blanc et en majuscule, vous pouvez utiliser une simple variation du code que vous avez affiché:

 #include  #include  int main(void) { char tagstr[60] = ""; const char *pad = ""; int k; int n = 5; for (k = 0; k < n; k++) { char temp[10] = ""; snprintf(temp, sizeof(temp), "%sval%d", pad, k); strcat(tagstr, temp); pad = ", "; } printf("tagstr <<%s>>\n", tagstr); return 0; } 

Le résultat du programme était:

 tagstr <> 

Cependant, votre code fonctionne correctement pour moi, avec toutefois la virgule en tête et le blanc.

temp n’est pas assez long pour contenir le résultat de votre sprintf . C’est exactement pourquoi vous devez utiliser snprintf , strncat et d’autres variantes des fonctions de chaîne qui prennent un paramètre de taille, chaque fois que vous le pouvez.