我正在使用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
可能的解释是什么?
答案 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(空字节)结尾的字符序列。
使用连续字符串的第一个字符溢出终结符。
注意未定义的行为。