使用以下代码创建控制台应用程序(将f重命名为入口点):
flex-wrap: wrap;
并输入5行5个字符,例如:
#include <iostream>
void f(){
char a[5][5];
std::cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4];
for (int y = 0; y<5; y++)std::cout<<a[y]<<'\n';
}
我希望输出与输入相同或抛出错误,但我得到了:
abcde
abcde
abcde
abcde
abcde
使用调试器进行调查时,每个abcdeabcdeabcdeabcdeabcde
abcdeabcdeabcdeabcde
abcdeabcdeabcde
abcdeabcde
abcde
值等于a[y]
,而不是显示的输出。
这到底是怎么回事? 为什么会发生这种情况,有没有办法阻止它?
是否与
有关变量'a'周围的堆栈已损坏
在abcde
之后抛出错误?
我很清楚使用嵌套循环获得所需输出的其他方法,但我想知道是否有一种方法只迭代外部维度,因此它使用较少的字符 - 这是代码高尔夫挑战。这有很大的不同:
std::cout
VS
for(int y=0;y<5;y++)std::cout<<a[y]<<'\n';
答案 0 :(得分:3)
问题是由于您尝试将"abcde"
存储在包含5个元素的char数组中。在数组中至少还需要一个元素来保存终止空字符。
因此,您的程序具有未定义的行为。我们可以尝试理解输出,但这是徒劳的。
使用
char a[5][6]; // Anything greater than 5 will work for your input
如果您不希望将代码绑定到硬编码大小,则可以使用std::string
。
std::string a[5];
答案 1 :(得分:1)
C-string是以空终止符结尾的字符序列。这意味着"abcde"
实际上是6个字符长,你看到5个加上空终止符。
由于您只为输入分配了足够的空间而没有使用null终止符尝试将字符串放入数组中,因此写入数组的末尾并且是未定义的行为。你需要的是
char a[5][6];
因为它有足够的空间容纳5个字符加上空终止符。