Я новичок в C ++ и написал код, в котором я получаю следующую ошибку:
Ошибка проверки времени выполнения # 2 — стек вокруг переменной ‘Scores’ был поврежден
Что вызывает эту ошибку?
Вот мой код:
#include <iostream> // Enables cout and endl
#include <string>
#include <sstream>
#include "stdafx.h"
using namespace std;
int getInput();
int main()
{
int scores[5];
int i;
int j;
int numberOfScores;
for (i = 0; i < 6; i++) // Sets all 5 elements of the array to zero
{
scores[i] = 0;
}
cout << "How many scores do you have to enter?\n" << endl;
cin >> numberOfScores;for (j = 0; j < numberOfScores; j++) // Gather test scores and increases each array index as that score is entered
{
scores[getInput()] ++;
}
cout << "The number of zeros: " << scores[0] << endl;
cout << "The number of ones: " << scores[1] << endl;
cout << "The number of twos: " << scores[2] << endl;
cout << "The number of threes: " << scores[3] << endl;
cout << "The number of fours: " << scores[4] << endl;
cout << "The number of fives: " << scores[5] << endl;return 0;
}
int getInput()
{
int enteredScore;
cout << "Enter the test scores one at a time.\n";
cout << "The range of scores is 0 to 5.\n";
cin >> enteredScore;
if (enteredScore >= 0 && enteredScore <= 5)
{
return enteredScore;
}
else
{
cout << "Error! The range of scores is 0 to 5.\n";
cout << "Enter the test scores one at a time.\n";
cin >> enteredScore;
return enteredScore;
}
}
Похоже, это объявление:
int scores[5];
Это неверно. Это создает массив с 5 числами в нем, индексы из scores[0-4]
Однако вы постоянно ссылаетесь на score[5]
, шестой элемент массива во всей вашей программе. Я рекомендую перейти на
int scores[6];
Эта проблема:
Вы получаете доступ к вашему массиву за пределами нескольких мест.
Здесь вы просматриваете 6 элементов, когда у вас есть только 5:
for (i = 0; i < 6; i++) // Loops through 6 elements
{
scores[i] = 0;
}
Здесь вы звоните getInput()
и использовать возвращаемое значение в качестве индекса:
scores[getInput()] ++;
Однако первая половина функции принимает входные данные от пользователя в диапазоне от 0 до 5, что позволяет получить доступ к 6 элементам:
if (enteredScore >= 0 && enteredScore <= 5)
Ситуация становится еще хуже, если пользователь вводит число за пределами этого диапазона, поскольку затем ему предоставляется вторая возможность ввести число, только на этот раз нет проверки и любой введенный номер принимается:
cin >> enteredScore;
return enteredScore;
Наконец, вы снова пытаетесь получить доступ к 6-му элементу здесь:
cout << "The number of fives: " << scores[5] << endl;
Решение:
Во-первых, вам нужно сделать одну из двух вещей:
for
петли, if
заявление и cout
заявления, чтобы они не получили доступ к индексу 5или же:
int scores[6];
Во-вторых, вам нужно исправить ошибку в вашем getInput()
функция, так что он проверяет правильность ввода. Вы можете попробовать это, например:
int getInput()
{
int enteredScore;
cout << "Enter the test scores one at a time.\n";
cout << "The range of scores is 0 to 4.\n";
cin >> enteredScore;
while (enteredScore < 0 || enteredScore > 4)
{
cout << "Error! The range of scores is 0 to 4.\n";
cout << "Enter the test scores one at a time.\n";
cin >> enteredScore;
}
return enteredScore;
}
У вас ошибка в
cout << "The number of fives: " << scores[5] << endl;
Ваш массив имеет размер 5, но вы получаете доступ к 6-му элементу.
То же самое с for (i = 0; i < 6; i++)
должно быть i < 5
,