只是尝试将字符分配给char数组,它表示字符串在非空终止?
我希望能够像记分牌一样更改阵列中的团队。
#include <string.h>
#include <iostream>
int main(int argc, char* argv[])
{
char Team1[7] = "Grubs";
char Team2[7] = "Giants";
char Team3[7] = "Bulls";
char Team4[7] = "Snakes";
char Team5[7] = "Echos";
char TeamList[5][7];
strcpy_s(TeamList[0], Team1);
strcat_s(TeamList[1], Team2);
strcat_s(TeamList[2], Team3);
strcat_s(TeamList[3], Team4);
strcat_s(TeamList[4], Team5);
TeamList[5][7]= '\0';
system("pause");
return 0;
}
答案 0 :(得分:0)
strcat
要求目标中已存在以null结尾的字符串,以将源字符串连接到;你在目的地用未初始化的值来调用它。
在每种情况下看起来都需要strcpy
,而不仅仅是第一个。
另外,删除虚假TeamList[5][7]= '\0';
。即使你修复它在数组边界内写入,每个字符串也已被strcpy
终止,所以没有必要自己尝试这样做。
然后停止使用低级数组和指针。 std::vector<std::string>
会更友好。
答案 1 :(得分:0)
strcat()(这是strcat_s()的“安全性较低”版本)要求两个字符串都以空值终止。那是因为strcat()在第一个参数(source
)结束时附加了第二个参数(dest
)。它用源的第一个字符替换dest的null终止符,追加source
的其余部分然后
一个空字符包含在由...形成的新字符串的末尾
的串联
我只想改变
strcpy_s(TeamList[0], Team1);
strcat_s(TeamList[1], Team2);
strcat_s(TeamList[2], Team3);
strcat_s(TeamList[3], Team4);
strcat_s(TeamList[4], Team5);
到
strcpy_s(TeamList[0], Team1);
strcpy_s(TeamList[1], Team2);
strcpy_s(TeamList[2], Team3);
strcpy_s(TeamList[3], Team4);
strcpy_s(TeamList[4], Team5);
strcpy_s()
对目的地内容没有任何要求 - 只有其容量很重要。
如果您想坚持strcat_s()
,请执行以下操作:
char TeamList[5][7];
memset(TeamList, 0, sizeof(char) * 5 * 7);
然后,这一行:
TeamList[5][7]= '\0';
不是必需的,无论如何都是不正确的,因为对于N元素数组有效索引是[0; N-1]。
修改强>
因为在你的情况下交换发挥作用,我会建议你完全不同的方法。
首先:
#include <string>
然后,以这种方式初始化团队:
std::string TeamList[] =
{
"Grubs",
"Giants",
"Bulls",
"Snakes",
"Echos"
};
现在,TeamList
是一个包含5个元素的数组,每个元素都是std :: string类型的对象,包含特定团队的名称。
现在,如果你想交换,比方说,第1和第3组:
std::swap(TeamList[1], TeamList[3]);
std::swap()
是标准库实现中广泛使用的标准C ++函数。它适用于许多标准类型,包括std::string
。这个解决方案有一个重要的好处:如果字符串的内容保存在堆上,交换两个字符串就像交换指针(以及一些长度/容量变量)一样简单。
哦,还有一件事:如果你不熟悉std::string
,你需要获得指向包含字符串数据的缓冲区的指针,你可以这样做:
const char* team_1_raw_name = TeamList[0].c_str();