C ++将char复制到char数组(Debug assertion failed)表示string不是以null结尾

时间:2015-03-21 14:23:44

标签: c++

只是尝试将字符分配给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;
}

2 个答案:

答案 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();

请参阅this page for more info about std::string