2011-09-20 85 views
1

我试图读取用户输入的值,把他们放到一个字符串类数组中,但我得到一个BAD EXCESS错误,我猜它的事情很简单,我做错了。这是我得到的。任何帮助将是巨大的C++字符串类输入

int main() 
{ 
    const int SIZE = 5; 
    string fruity[SIZE]; 
    int i; 

    cout << "Enter the names of five kinds of fruit:" << endl; 
    for(i = 0; i < SIZE; i++) 
    { 
     cout << "Enter Name of Fruit" << endl; 
     getline(cin, fruity[i]); 
    } 

    cout << fruity[i] << endl; 

    return 0; 
} 
+2

什么是“坏过剩” ......?暴饮暴食? –

+0

因为我试图自我教导 – hart929

回答

4
cout << fruity[i] << endl; 

这是无效的。做到这一点,而不是:

for(i = 0; i < SIZE; i++) 
    cout << fruity[i] << endl; 

因为在这一点上你的i将等于SIZE,并是无效的。

+0

,所以在技术上没有功课,那么现在已经有用户输入值填充的“水果”数组? – hart929

+0

他在哪里做'水果[]'? – quasiverse

+0

'水果[0]'应该'水果[我]'?? –

2

在for循环之后,变量i的值为SIZE,所以当您尝试访问它时,您将出现界限。你将不得不使用另一种循环,如果你想输出它像这样:

for (i = 0; i < SIZE; i++) { 
    cout << fruity[i] << endl; 
} 
+0

'i'在'for'循环之外声明。 –

+0

Eugh。那里发生了什么。编辑来解决真正的问题。 – quasiverse

+0

那么数组现在由输入填充了吗?所以如果我想把它发送到选择类别,我可以吗? – hart929

0

你需要一个循环:

for(int i = 0; i < SIZE; i++) 
{ 
    cout << fruity[i] << endl; 
} 
+1

使用'#include '循环或'std :: for_each'。 – ssube

1

在下面的语句

cout << fruity[i] << endl; 

“i”是超出范围。当退出for循环“5”时,“i”的值你的编译器应该警告过你在for循环的范围之外使用“i”。你的for循环设置果味[0],果味[1],果味[2],果味[3],果味[4],但“果味[5]”超出范围。因此,当您尝试打印“水果[i]”时会产生垃圾数据。这导致seg故障崩溃。

1

始终使变量地方尽可能。 C++允许您在循环内定义循环变量

for(int i = 0; i < SIZE; i++) 
{ 
    ... 
} 
// i no longer in scope 

以便它们在循环结束时超出范围,这与本地获得的范围相同。

这样做,就会发现你正在使用i访问数组循环后,在这一点i具有价值SIZE,导致访问越界的。 (记住,数组中有索引0..SIZE-1

我不知道在你的程序

cout << fruity[i] << endl; 

最后一行应该做的事,但如果你想输出数组的conetent(如其他答案建议),你确实需要另一个循环。

其他更小的点:

  1. 我们真的不知道你用的是什么串类,因为您省略了std::前缀。 (对于您使用的标准库中的所有其他标识符也是如此。)I disapprove of that

  2. 数组索引的正确类型是std::size_t

  3. std::endl机械手将插入一个'\n'到输出流中并冲洗流的缓冲区。在您的交互式控制台程序中,这通常不会造成任何伤害。但请记住,过早刷新缓冲区可能会大大减慢程序的速度。 (我曾见过一个案例是一个程序将大量数据写入文件流中,几个字节的涓流由于此而减慢了一个数量级。)在这种情况下,手动刷新输出流#s缓冲区从来没有真正的必要。 (当然,你想你会提示您从输入流中读取之前出现,但是这是由std::cout被捆绑到std::cin默认情况下实现的,使得std::cout冲洗每当程序试图从std::cin阅读。)

程序,我会写出来,应该是这样的:

// Beware, brain-compiled code ahead! 
#include <string> 
#include <iostream> 

int main() 
{ 
    const std::size_t size = 5; 
    std::string fruity[size]; 

    std::cout << "Enter the names of five kinds of fruit:" << '\n'; 
    for(std::size_t i = 0; i < size; ++i) 
    { 
     std::cout << "Enter Name of Fruit" << '\n'; 
     std::getline(std::cin, fruity[i]); 
    } 

    for(std::size_t i = 0; i < size; ++i) 
    { 
    std::cout << fruity[i] << `\n`; 
    } 

    return 0; 
}