Странный вывод из запущенной программы - PullRequest
0 голосов
/ 05 апреля 2019

Я написал некоторый код о массивах и строках, с которым мне неудобно работать (я новичок). Эта ошибка - проблема времени выполнения, так как компилятор не кричал на меня, когда эта программа компилировалась. Я полностью застрял в этом, и не знаю, почему это произошло.

# include<iostream>
# include<cstdio>
# include<cstring>
# include<string>
using namespace std;
int main() {
    char in[100];
    gets(in);
    int len = strlen(in);
    std::string s(in);
    int count = 0;
    for (int i = 0; i < len; i++) {
        if (s.at(i) == ' ') {
            count += 1;
        }
    }

    int i = 0;
    char rec[100];
    for (int j = 0; j < len; j++) {
        if (s.at(j + 1) != ' ') {
            i += 1;
            rec[i] = s.at(j);
        } else {
            i += 1;
            rec[i] = s.at(j);
        }
    }

    for (int m = 0; m < i; m++) {
        cout << rec[m];
    }

    //cout << count;

}

Предположим, пользовательский ввод "Hello World" (без кавычек). Он должен был вернуть «Hello», но вместо этого получил сообщение об ошибке:

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::at

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

и последовало всплывающее сообщение для команды Microsoft.

1 Ответ

0 голосов
/ 05 апреля 2019

Отметьте «at» и еще раз внимательно посмотрите на комментарии некоторых программистов:
http://www.cplusplus.com/reference/array/array/at/

 It throws out_of_range if n is out of bounds.

Да, пожалуйста, особенно когда спрашиваете других: не используйте 1-буквенные переменные
Не используйте имена переменных, такие как «count» или «rec», которые трудно интерпретировать

...