将int数组附加到c中的字符串:

时间:2014-09-24 13:16:18

标签: c c-strings

我正在尝试将一个整数数组附加到一个字符串中,基本上我试图将它变成以下格式:A:123456其中A是一个字符,由参数给出,而123456是一个整数数组。我在运行代码时遇到总线错误,我已经在这里进行了搜索,并在谷歌上找到了正确的方法来做类似于我希望实现的目标,但是示例与此没有直接关系,所以我想知道我是否能得到一些帮助。提前致谢

char *print_cards_played(Player *player) {
    char *result = "";
    int i = 0;

    result += sprintf(result, "%c :", player->playerID);

    while(player->cardsPlayed[i] != 0) {
        result += sprintf(result, "%d", player->cardsPlayed[i]);
        i++;
    }

    result += sprintf(result, "\n");

    return result;
}

5 个答案:

答案 0 :(得分:3)

你不能"追加"到由以下定义的字符串:

char *result = "";

所有这些都是一个名为result的指针,它指向存储器中存储字符'\0'(字符串终结符)的单个只读位置。你不能写信给它。

你需要一个合适大小的实际缓冲区:

char *result = malloc(128);

如果分配成功,你就拥有了所谓的"堆缓冲区"即使执行分配的功能退出,它也将保持不变。你可以安全地return这个指针,不像一个本地数组,它会在函数退出时消失。

然后您可以使用sprintf(),但当然不能使用+=,您无法在C中添加字符串。最佳解决方案可能是sprintf()到临时小字符串,然后strcat()字符串到result。您可以跟踪附加长度以使其快速,但这对于现代机器上的小问题并不重要。

答案 1 :(得分:2)

试试这个

char *print_cards_played(Player *player) {
    char result[128];// = "";
    char *p = result;
    int i = 0;

    p += sprintf(p, "%c :", player->playerID);

    while(player->cardsPlayed[i] != 0) {
        p += sprintf(p, "%d", player->cardsPlayed[i]);
        i++;
    }

    p += sprintf(p, "\n");

    return strdup(result);
}

答案 2 :(得分:1)

您可以编写自己的函数并在snprintf范例上对其进行建模,该范例采用缓冲区及其长度,并使用所需的字符串填充缓冲区。如果缓冲区太小,字符串将被截断,但仍然是一个有效的以null结尾的字符串:

int str_cards_played(char *buf, int nbuf, const Player *player)
{
    int n;
    int i = 0;

    n = snprintf(buf, nbuf, "%c: ", player->playerID);

    while(n < nbuf && player->cardsPlayed[i] != 0) {
        n += snprintf(buf + n, nbuf - n, "%d", player->cardsPlayed[i]);
        i++;
    }

    if (n < nbuf) n += snprintf(buf + n, nbuf - n, "\n");
    return n;
}

您可以像这样调用函数:

char buf[20];

str_cards_played(buf, sizeof(buf), player);
printf("'%s'\n", buf);

如果像这里一样在堆栈上进行分配,则不必担心内存管理。

答案 3 :(得分:0)

总线错误是由于:char *p = "String Literal";

原因在c-faq中清楚地表明了,

  

在其他地方,它变成一个未命名的静态字符数组,这个未命名的数组可能存储在只读存储器中,因此不一定能被修改。在表达式上下文中,数组一如既往地转换为指针,因此第二个声明将p初始化为指向未命名数组的第一个元素。

答案 4 :(得分:0)

使用下面描述的strcatInt来连接char *和int

char* itoa(int i, char b[]){
    char const digit[] = "0123456789";
    char* p = b;
    if(i < 0){
        *p++ = '-';
        i *= -1;
    }
    int shifter = i;
    do{ //Move to where representation ends
        ++p;
        shifter = shifter/10;
    } while(shifter);
    *p = '\0';
    do{ //Move back, inserting digits as u go
        *--p = digit[i%10];
        i = i/10;
    } while(i);
    return b;
}

char* strCatInt(char* str, int num) {
    char numStr[10];
    itoa(num, numStr);
    return strcat(str, numStr);
}