Earl Foz Ответов: 2

Ошибка в программе, если в имени поставить запятую ","


Например.
Если я наберу имя Боб Марли. Программа будет работать.
Но если я наберу имя, как этот Марли, Боб. Аварийное завершение программы.

Что я уже пробовал:

Это программа, которую я сделал.


#include <iostream>
#include <string>

using namespace std;

int main()
{
 string name[20];
 int grade[20];
 int index[20];
 int i, j;

 for(i=0;i<=20;i++)
 {
  cout << "Please enter name: ";
  cin >> name[i];
  cout << "Please enter grade: ";
  cin >> grade[i];
 }

 for(i=0;i<=20;i++)
 {
  index[i]=i;
 }

 for(i=0;i<=20;i++)
 {
  for(j=i+1;j<=20;j++)
  {
   int temp;
   
   if(name[index[i]] > name[index[j]])
   {
    temp = index[i];
    index[i] = index[j];
    index[j] = temp;
   }
  }
 }
 cout << endl;

 for(i=0;i<=20;i++)
 { 
  cout << name[index[i]] << "        "
   << grade[index[i]] << endl;
 }

 cin.ignore();
 cin.get();

 
}

2 Ответов

Рейтинг:
2

Patrice T

string name[20];

Это не массив из 20 строк, это строка размером 20.


Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Richard MacCutchan

Нет, это массив строк.

Patrice T

Ой, моя беда.

Jochen Arndt

"Это не массив из 20 строк, это строка размера 20."

В C / C++ тип var[]; определяет массив.

Patrice T

Ой, моя беда.

Рейтинг:
0

Jochen Arndt

У вас есть массивы размером 20. Но во всех ваших циклах вы повторяете более 21 элемента:

for(i=0;i<=20;i++)

С последней итерацией вы получаете доступ к элементу array[20] но допустимые индексы-от 0 до 19. Это называется выходом из связанного доступа. То, что произойдет, предсказать невозможно. В то время как чтение просто возвращает неправильные значения, запись перезаписывает другие данные и может привести к нарушению доступа.