substring () выбрасывает необработанное исключение - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь сделать простую программу, которая поможет пользователю быстро научиться печатать. Он печатает символ, и пользователь должен быстро нажать его, чтобы «выиграть».

Я получаю ошибку во время выполнения:

Необработанное исключение в 0x772A33D2 в Learn To Type Quick.exe: исключение Microsoft C ++: std :: out_of_range в расположении памяти 0x00FEF138. произошло

Вот мой код:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string.h>
using namespace std;
int main()
{
    srand((unsigned)time(NULL));
    while (true)
    {
        int r = rand() % 26;
        string length = "abcdefghijklmnopqrstuvwxyz";
        size_t found = r;
        size_t sz = 1;
        string sub = length.substr(length.at(found),sz);
        cout << sub << endl;
    }
}

1 Ответ

2 голосов
/ 22 июня 2019

std::string::substr() принимает индекс в качестве входных данных, но вы передаете символ , который был получен из данного индекса. Значение этого символа неверно истолковано как индекс, и все символы в вашей строке имеют числовые значения (97..122), которые выше size() из ваша строка (26), поэтому substr() выдает std::out_of_range исключение:

Исключения

std::out_of_range если pos > size()

При звонке substr() необходимо заменить length.at(found) на found:

//string sub = length.substr(length.at(found),sz);
string sub = length.substr(found,sz);
...