std :: out 2d char的外部维度

时间:2017-10-13 17:33:22

标签: c++

使用以下代码创建控制台应用程序(将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';

2 个答案:

答案 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个字符加上空终止符。