C++将 char 复制到 char 数组(调试断言失败)时,字符串不是以 null 结尾的

C++ copying char to a char array (Debug assertion failed) says string is not null terminated

本文关键字:char 字符串 null 结尾 失败 复制 数组 C++ 断言 调试      更新时间:2023-10-16

只是试图将字符分配给字符数组,它说字符串不以空结尾?

我希望能够像记分牌一样改变数组中的球队。

#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>会友好得多。