Ошибка C ++ std :: out_of_range при попытке запустить программу - PullRequest
1 голос
/ 01 июня 2011

Хорошо, во-первых, я довольно новичок в программировании, я только прочитал немного материала и работал над некоторыми проектными проблемами Эйлера, чтобы как-то обдумать концепции и тому подобное. Однако сегодня я получил сообщение об ошибке, в котором не смог разобраться, поэтому подумал, что попрошу здесь о помощи! Любые ссылки или советы приветствуются!

Вот сообщение об ошибке:

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

Так что любой совет, который вы могли бы получить, был бы потрясающим! Если вам нужен мой код или есть вопросы, задавайте! Хотя я лучше попробую разобраться в проблеме, чем найду ответ сам! Спасибо!

РЕДАКТИРОВАТЬ: Хорошо, так как вы, ребята, говорите, что вам нужно увидеть код здесь, он есть.

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

int stringtoint(string s_convertee)
{
    int i=0;
    istringstream sin(s_convertee);
    sin >> i;
    return i;
}


int main()
{
string s_testnum = "233456091289474545356";
int n_maxmult = 0;
for (int i = 0; i<s_testnum.length(); i++)
  {
      int n_product = 1;
      for (int j = i; j<(i+4); j++)
      {
          string s_multiplier = s_testnum.substr(j, 1);
          int n_multiplier = stringtoint(s_multiplier);
          n_product *= n_multiplier;
      }
      if (n_product>n_maxmult)
      {
          n_maxmult = n_product;
      }

  }
return 0;
}

Ответы [ 6 ]

5 голосов
/ 01 июня 2011

С C ++ Ссылка для substr ,

Если пройденная позиция находится за концом строки, генерируется исключение out_of_range.

Так что я думаю, что вы будете звонить substr с первым параметром, который больше длины строки.


Поскольку вы опубликовали свой код, вы можете увидеть,

i может быть максимум s_testnum.length()-1,

, но

j возрастает до i+4-1 = s_testnum.length()+2.

Затем вы вызываете substr с первым параметром j, который, как сказано, может быть длиннее длины строки.Так что есть проблема.

3 голосов
/ 01 июня 2011

Как уже указывалось в других ответах, в substr

Если пройденная позиция находится за концом строки, генерируется исключение out_of_range.

В вашем коде:

for (int j = i; j<(i+4); j++)

Когда i 1 меньше s_testnum.length() j проходит s_testnum.length(), а когда вы это делаете, s_testnum.substr(j, 1); вызывает исключение out_of_range .

3 голосов
/ 01 июня 2011

Пожалуйста, оставьте свой код в вопросе.Скорее всего, вы сделали что-то вроде:

std::string s("foo");
s.substr(5, 1); // The length of the string is 3, 5 is out of bounds
2 голосов
/ 01 июня 2011

Вы вызываете substr с недопустимыми параметрами - вы пытаетесь получить элемент строки, которого там нет - например, пытаетесь взять 10-й символ, когда строка имеет только 5.

В вашем случае это вызвано substr - вы пытаетесь получить подстроку, которая слишком длинна для указанной начальной позиции, и она "выходит" из реальной строки.


terminate called after throwing an instance of 'std::out_of_range'

^^^^ говорит, что у вас есть неперехваченное исключение, то есть out_of_range

what(): basic_string::substr Aborted

^^^^ Это текст исключения - примечание substr

2 голосов
/ 01 июня 2011

Скорее всего, параметр функции substr, которую вы вызывали для какой-либо строки в вашем коде, превысил длину строки. Отсюда исключение std::out_of_range. Но это трудно сказать, не глядя на код. Кроме того, вы можете пройтись по коду и отладить его самостоятельно, используя отладчик типа gdb / ddd. Просто убедитесь, что вы скомпилировали свой код с флагом -g на g ++.

0 голосов
/ 01 июня 2011

Вы должны быть в состоянии отладить работу вашего отладчика при возникновении исключения.Запустите программу под отладчиком, установите соответствующую точку останова и посмотрите на обход стека.(Для записи, Ctrl + Alt + E должен вызвать диалоговое окно с параметрами обработки исключений в Visual Studios; команда catch throw активирует точку останова для исключения в gdb.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...