C在循环中使用int连接字符串

我是C的新手,我遇到了字符串问题。 我想要做的是在循环中创建一个像“val1,val2,val3”的字符串。

目前我的代码看起来像:

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

但是tagstr的输出是“,val#”,其中#是一些长整数值。 我猜这里我的指针做错了但是我已经尝试了所有我能想到的但没有成功……任何帮助都会非常感激。

编辑:更多上下文,如果它有帮助:

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

curTag是一个结构:

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

问题是sprintf(temp, ", val%i", temp, k);temp的值(实际上是数组中第一个字符的地址)添加到字符串中,并且根本不将k的值添加到字符串中。 这应该是sprintf(temp, ", val%i", k);

您可以提前计算您需要的空间量(包括零终结符):

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

也; 使用strcat是不好的(因为性能),因为你会反复搜索tagstr ,然后将新字符复制到最后。 最好跟踪tagstr的当前结束并在最后直接存储下一组字符而不进行搜索,没有临时字符串和没有复制。 例如:

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

适合我:

 $ 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] 

除非你说的问题是与最初的", " ..

你的临时数组太短了! 使用

 char temp[16]; 

如果您决定不想使用前导逗号和空白,则可以对显示的代码使用简单的变体:

 #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; } 

该计划的输出是:

 tagstr <> 

但是,您的代码对我来说正常,尽管使用前导逗号和空白。

temp不足以保存你的sprintf的结果。 这就是为什么你应该使用snprintfstrncat和带有size参数的字符串函数的其他变体的原因。