C++将 char 复制到 char 数组(调试断言失败)时,字符串不是以 null 结尾的
C++ copying char to a char array (Debug assertion failed) says string is not null terminated
只是试图将字符分配给字符数组,它说字符串不以空结尾?
我希望能够像记分牌一样改变数组中的球队。
#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]= ' ';
system("pause");
return 0;
}
strcat(((这是strcat_s((的"不太安全"版本(要求两个字符串都以null结尾。这是因为 strcat(( 在第一个参数 (dest
( 结束的地方附加了它的第二个参数 (source
(。它将 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]= ' ';
不是必需的,无论如何都是不正确的,因为对于 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();
有关 std::string 的更多信息,请参阅此页面
>strcat
要求目标中已经有一个以 null 结尾的字符串来连接源字符串;你在目标中使用未初始化的值调用它。
看起来您在每种情况下都希望strcpy
,而不仅仅是第一种情况。
另外,删除虚假TeamList[5][7]= ' ';
。即使您将其修复为在数组边界内写入,每个字符串也已被 strcpy
终止,因此无需尝试自己执行此操作。
然后停止使用低级数组和指针。 std::vector<std::string>
会友好得多。