我是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 < 5; k++) {
char temp[10] = "";
sprintf(temp, ", val%i", temp, k);
strcat(tagstr, temp);
}
// This prints out something like ", val-890132840" x 5 (same number)
printf ("String is now: %s\n", tagstr);
}
curTag = *(curTag.parent);
tagsClosed--;
} while (tagsClosed > 0);
curTag是一个结构:
typedef struct Tag {
char * name;
int size; // number of children
int tagnum;
struct Tag* parent;
} Tag;
答案 0 :(得分:8)
问题是sprintf(temp, ", val%i", temp, k);
将temp
(实际上是数组中第一个字符的地址)的值添加到字符串中,并且不添加{{1}的值根本就是字符串。这应该是k
。
您可以提前计算您需要的空间量(包括零终结符):
sprintf(temp, ", val%i", k);
也;使用5+1 + 5+1 + 5+1 + 5+1 + 5+1 + 1 = 31 characters
是不好的(因为性能),因为你会反复搜索strcat
的结尾,然后将新字符复制到最后。最好跟踪tagstr
的当前结束,然后在最后直接存储下一组字符,不进行搜索,不进行临时字符串,也不进行复制。例如:
tagstr
答案 1 :(得分:3)
适合我:
$ 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]
除非您说问题与初始", "
..
答案 2 :(得分:2)
你的临时数组太短了! 使用
char temp[16];
答案 3 :(得分:2)
如果您决定不想使用前导逗号并留空,则可以对显示的代码使用简单的变体:
#include <stdio.h>
#include <string.h>
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 <<val0, val1, val2, val3, val4>>
但是,您的代码对我来说正常,尽管有逗号和空白。
答案 4 :(得分:0)
temp
不足以保存sprintf
的结果。这正是您应该尽可能使用snprintf
,strncat
以及带有大小参数的字符串函数的其他变体的原因。