簡體   English   中英

C ++字符串類輸入

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

應該這樣做,但是如果要輸出數組的錐度(如其他答案所示),則確實需要另一個循環。

其他更重要的要點:

  1. 我們真的不知道您在使用什么字符串類,因為您省略了std::前綴。 (對於您正在使用的std庫中的所有其他標識符,也是如此。) 我不同意這一點

  2. 數組索引的正確類型是std::size_t

  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM