我正在尝试将一个整数数组附加到一个字符串中,基本上我试图将它变成以下格式: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;
}
答案 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);
}