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.