[英]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.