C ++中的矩形二维字符数组

时间:2012-02-17 13:39:09

标签: c++ arrays string char

我正在使用2D字符数组来存储多个字符串。下面的代码工作正常&输出正确的字符串。

    char str[3][4];

    std::cin >> str[0] >> str[1] >> str[2] >> str[3];

    std::cout << str[0] << '\n' << str[1] << '\n' << str[2] << '\n' << str[3];

,但,当我尝试这个

    char str[3][3];

    std::cin >> str[0] >> str[1] >> str[2];

    std::cout << str[0] << '\n' << str[1] << '\n' << str[2];

然后,如果我输入

abc

xyz

pqr

我得到了输出

abcxyzpqr

xyzpqr

pqr

可能的解释是什么?

4 个答案:

答案 0 :(得分:4)

字符串的大小为3,您输入的字符为3个字符。这意味着它不会获得存储空字符\0的空间,因此无法找到字符串的结尾。

答案 1 :(得分:4)

原因是C字符串以空值终止。这意味着当遇到第一次出现空字符('\ 0',值为0)时,它们被视为结束。

当你在str [0]中输入三个字符的字符串“abc”时,它将在内存中表示为{'a','b','c','\ 0'}。四个字符,最后一个是空终止符。

这个空终止符然后被以下输入覆盖,因为str [0]是一个3-char字符串,因此,空终止符将被写入str [0] [3],这相当于str [1] [ 0]。

答案 2 :(得分:3)

这是因为你为每个字符串分配了3 char个,它们的长度为3 - 因此字符串末尾没有\0。 C ++字符串应以\0结尾以标记结尾。当分配4 char时,C ++会自动使用\0填充每个字符串。当您需要最多存储n+1 char时,可以安全地创建至少n char的数组。

似乎char的总共9 str是连续的,因此第一个字符串的长度为9. cout语句从str[0][0]开始打印,由于\0末尾没有str[0],因此会继续打印str[1]str[2]

答案 3 :(得分:2)

这些字符串被命名为'0-terminated',因为C中的文字字符串是以0(空字节)结尾的字符序列。

使用连续字符串的第一个字符溢出终结符。

注意未定义的行为。