1

我一直在为课堂作业做作业,但我不断收到一个我无法修复的错误。这是我的代码的一部分。

#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std; 

const int SIZE = 444;

int main()

{

char person1a[SIZE], person1b[SIZE], person2a[SIZE], person2b[SIZE],  person3a[SIZE], person3b[SIZE],       
     person4a[SIZE], person4b[SIZE];

inData >> person1a[SIZE], person1b[SIZE], person2a[SIZE], person2b[SIZE],       person3a[SIZE], person3b[SIZE], person4a[SIZE], person4b[SIZE]; 

return 0;

}

代码还有更多内容,但我已将问题缩小到这些行。无论我如何安排它们或我使用什么运算符,我总是在第一个数组处遇到堆栈错误。至少对我来说,我已经尝试过显而易见的事情,例如

inData >> person1a;
inData >> person1b;
etc
inData >> person1a >> person2b >> etc

等等,但我就是无法克服这个错误。

我是否在这里遗漏了一些明显的东西,如果我有任何人可以帮助我吗?

作为记录,我知道已经有几个关于这个的话题,但我现在只参加了我在学校的第一堂编程课,所有其他话题都包含了太多额外的内容,我无法理解。

4

3 回答 3

2

您的数组声明为:

char person1a[SIZE]; 

访问数组时的有效下标0SIZE-1

随着声明:

inData >> person1a[SIZE], person1b[SIZE], person2a[SIZE], person2b[SIZE],       person3a[SIZE], person3b[SIZE], person4a[SIZE], person4b[SIZE]; 

您正在写一个过去为每个数组分配的内存。

因为,您使用的是 C++,所以您应该使用std::string而不是 c 样式的数组。
它为您节省了所有此类问题,并提供了字符数组为您提供的所有功能。

于 2012-11-28T11:20:03.370 回答
2

当您访问person1a[SIZE]etc 时,您违反了数组边界数组索引是基于 0 的,因此最大索引SIZE-1不是SIZE

于 2012-11-28T11:20:26.010 回答
2
inData >> person1a[SIZE]

假设这inData是某种std::istream或类似的,它将单个字符流式传输到SIZE数组的元素中。由于这是数组的大小,并且有效索引在 range[0,SIZE-1]中,因此它写入数组之外导致堆栈损坏。

如果您打算读取一个字符串,则读入数组本身:

inData >> person1a

当然,如果用户输入的字符太多,这也会造成损坏,所以使用std::string存储字符串,而不是乱用字符数组。

此外,要流入不止一件事,链>>

inData >> person1a >> person1b >> ...;

您的代码使用逗号运算符,这意味着您实际上只是流式传输到person1a,并且语句的其余部分无效。

于 2012-11-28T11:20:32.267 回答