[英]C++ String Class Input
我试图读取用户输入的值以将它们放入字符串类数组中,但是却遇到了BAD EXCESS
错误,我猜测它做错了一些非常简单的事情。 这就是我得到的。 任何帮助都会很棒
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;
}
cout << fruity[i] << endl;
这是无效的。 改为这样做:
for(i = 0; i < SIZE; i++)
cout << fruity[i] << endl;
因为那时您的i
将等于SIZE
,而fruity[SIZE]
无效。
在for循环之后,变量i
的值为SIZE
,因此当您尝试访问它时,您将超出范围。 如果要这样输出,则必须使用另一个循环:
for (i = 0; i < SIZE; i++) {
cout << fruity[i] << endl;
}
在下面的语句中
cout << fruity[i] << endl;
“ i”超出范围。 退出for循环“ 5”时的值为“ i”,并且您的编译器应已警告您不要在for循环范围内使用“ i”。 您的for循环设置了fruity [0],fruity [1],fruity [2],fruity [3],fruity [4],但“ fruity [5]”超出了范围。 因此,当您尝试打印“ fruity [i]”时会浪费数据。 这会导致段故障崩溃。
始终使变量尽可能局部化 。 C ++允许您在循环中定义循环变量
for(int i = 0; i < SIZE; i++)
{
...
}
// i no longer in scope
因此它们在循环的最后就超出范围了,因为它是本地化的。
这样做将显示您在循环后当前正在使用i
来访问数组,此时i
的值为SIZE
,从而导致访问超出范围 。 (请记住,数组的索引为0..SIZE-1
。)
我不知道你程序的最后一行
cout << fruity[i] << endl;
应该这样做,但是如果要输出数组的锥度(如其他答案所示),则确实需要另一个循环。
其他更重要的要点:
我们真的不知道您在使用什么字符串类,因为您省略了std::
前缀。 (对于您正在使用的std库中的所有其他标识符,也是如此。) 我不同意这一点 。
数组索引的正确类型是std::size_t
。
std::endl
操纵器将在输出流中插入'\\n'
并刷新流的缓冲区 。 在您自己的交互式控制台程序中,这通常不会造成任何危害。 但是请记住这一点,因为过早刷新缓冲区可能会大大减慢程序速度。 (由于这种情况,我已经看到一种情况,程序将几个字节的细流写入文件流中的数据被减慢了一个数量级。)在您的情况下,手动刷新输出流的缓冲区从来没有真正必要。 (当然,您确实希望您的提示出现在从输入流中读取之前出现,但这是通过将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;
}
您需要一个循环:
for(int i = 0; i < SIZE; i++)
{
cout << fruity[i] << endl;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.