2014-11-25 3 views
0

Я кодирую назначение для своего класса, где пользователь будет вводить 10 буквенных ответов, и программа вернет оценку. Недавно я изменил свои массивы char на строковые массивы, потому что, я думаю, это облегчает чтение. Я отправился отлаживать свой код и теперь получаю сообщение об ошибке «Deubug Assertion Failed». Я не знаю, что это значит или как это исправить.C++ Debug Assertion Failed string arrays

Любая помощь будет оценена по достоинству. Спасибо!

Ниже мой код:

// Lab 8 
// programmed by Elijah Barron 

#include <iostream> 
#include <string> 
#include <iomanip> 
using namespace std; 


//Function headers 
string inputAnswers(string given); 
int numCorrect(string correctAnswers, string given); 

int main() 
{ 
    string correctAnswers = "BCADBADCAB"; 
    string given; 
    int numRight = 0; 

    inputAnswers(given); 

    numCorrect(correctAnswers, given); 

    double grade = 10 * numRight; 

    cout << "Your quiz grade is " << grade << "%" << endl; 

    return 0; 
} 
//Get the answers 


string inputAnswers(string given) 
{ 
    for (int n = 0; n < 10; n++) 
    { 
     cout << "Please enter your answer for question #" << n + 1 << " "; 
     cin >> given[n]; 
    } 
    return given; 
} 

//Find if answers are correct or incorrect 

int numCorrect(string correctAnswers, string given) 
{ 
    int numRight = 10; 
    int n = 0; 
    for (int n = 0; n < 10; n++); 
    { 
     if (given[n] != correctAnswers[n]) 
      numRight -= 1; 
    } 

    return numRight; 
} 

ответ

1

Непосредственная проблема в том, что given будет начинаться как пустая строка, как вы не присвоили ему значение:

cin >> given[n]; 

вызывает ошибку утверждения, потому что вы пытаетесь изменить первый (второй, третий и т. Д.) Символ в строке с длиной нуля. Для решения этой проблемы утверждают, (но не программу, которая всегда будет возвращать 0%), просто инициализирует строку:

string given = "ZZZZZZZZZZ"; 


Чтобы исправить остальные вещи (кстати, это не единственный способ):

Изменение:

string inputAnswers(string given); //for both prototype and function. 

к:

void inputAnswers(string& given); //pass by reference instead of pass by value. 
//also get rid of "return given;" 

Изменение:

int n = 0; //the n here is different to the one in the next line 
for (int n = 0; n < 10; n++); //this n's scope begins and ends here thanks to the semicolon 
{//the code here is executed once, this isn't in the loop! 
    if (given[n] != correctAnswers[n]) //we're using the first n here, which is 0. 
     numRight -= 1; 
} 

к:

for (int n = 0; n < 10; n++) //only one n variable and no semicolon 
{// now this is in the loop and will execute 10 times. 
    if (given[n] != correctAnswers[n]) 
     numRight -= 1; 
} 

Не связывайтесь с этой линии:

int numRight = 0; //Set at 0 and then never changed. 

и изменения:

numCorrect(correctAnswers, given); 

чтобы:

int numRight = numCorrect(correctAnswers, given); //declared when necessary and assigned the correct value 
+0

Хороший улов на этой точкой с запятой, но так как 'n' объявлен в цикл выходит из области видимости, в то же точку с запятой, код в следующих скобках использует другой' n', который был объявлен выше петля.Этот 'n' будет по-прежнему установлен на ноль. – iwolf

+0

Правда. Исправление :) – splrs

+0

Спасибо! Это решило мою проблему отлично! – Elijah

0

Вы либо хотите reserve достаточно места в вашем вектор для хранения 10 символов, или использовать push_back для заполнения вектора. Индексирование вектора с [] не вырастет для вас вектором.

EDIT:

Игнорируйте первую часть о reserve. Это не останавливает утверждение отладки. Вы хотите изменить

cin >> given[n]; 

Чтобы что-то вроде этого:

char input; 
cin >> input; 
given.push_back(input); 
Смежные вопросы