【问题标题】:C concatenate string with int in loopC在循环中将字符串与int连接起来
【发布时间】:2012-11-01 00:57:15
【问题描述】:

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

【问题讨论】:

  • 第一个问题temp[5] 的错误不足以容纳 ", valk" 使其成为 temp[10] 或只是为了确保您有足够的空间。
  • 哎呀,已修复。不过同样的问题。
  • 您发布的代码很好(除了它不编译)。它也与指针无关。您需要向我们展示您的实际代码。
  • 我不确定哪里出了问题,然后...编辑以添加更多上下文,如果有帮助的话。

标签: c string


【解决方案1】:

问题是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);
}

【讨论】:

    【解决方案2】:

    适合我:

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

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

    【讨论】:

    • 给或取#include &lt;string.h&gt;#include &lt;stdio.h&gt;,我用&lt;&lt;&gt;&gt;代替方括号,这也是我得到的结果。
    【解决方案3】:

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

    char temp[16];
    

    【讨论】:

    • 已编辑以解决此问题 - 但它仍然存在相同的问题。
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 已编辑以解决此问题 - 仍然存在同样的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2014-08-30
      相关资源
      最近更新 更多