C ++ String Class Input - PullRequest
       3

C ++ String Class Input

1 голос
/ 20 сентября 2011

Я пытаюсь прочитать введенные пользователем значения и поместить их в массив классов строк, но я получаю ошибку 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;
}

Ответы [ 5 ]

4 голосов
/ 20 сентября 2011
cout << fruity[i] << endl;

Это недействительно. Сделайте это вместо:

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

Потому что в этот момент ваш i будет равен SIZE, а fruity[SIZE] недействителен.

2 голосов
/ 20 сентября 2011

После цикла for переменная i имеет значение SIZE, поэтому при попытке доступа к ней вы выходите за пределы.Вам придется использовать другой цикл, если вы хотите вывести его следующим образом:

for (i = 0; i < SIZE; i++) {
    cout << fruity[i] << endl;
}
1 голос
/ 20 сентября 2011

Всегда сделать переменные максимально локальными . 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;
}
1 голос
/ 20 сентября 2011

В следующем утверждении

cout << fruity[i] << endl;

«i» находится вне диапазона.Значение «i» при выходе из цикла «5» И ваш компилятор должен был предупредить вас об использовании «i» вне области цикла for.Ваш цикл for устанавливает фруктовый [0], фруктовый [1], фруктовый [2], фруктовый [3], фруктовый [4], но «фруктовый [5]» находится вне диапазона.Следовательно, мусорные данные при попытке вывести «fruity [i]».Это приводит к сбою ошибки сегмента.

0 голосов
/ 20 сентября 2011

Вам нужен цикл:

for(int i = 0; i < SIZE; i++)
{
   cout << fruity[i] << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...