3

我是 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;
4

5 回答 5

9

问题在于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

还; usingstrcat不好(对于性能),因为您会反复搜索 the 的末尾,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);
}
于 2012-11-01T01:40:19.557 回答
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]

除非你说问题出在最初的", "..

于 2012-11-01T01:12:08.530 回答
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>>

但是,您的代码对我来说可以正常工作,尽管前面有逗号和空格。

于 2012-11-01T01:21:44.883 回答
2

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

char temp[16];
于 2012-11-01T01:04:38.980 回答
0

temp不足以保存你的结果sprintf。这正是您应该尽可能使用带有大小参数的字符串函数的其他变体的snprintf原因。strncat

于 2012-11-01T01:02:21.457 回答