C++ std::out_of_range d'erreur lorsque j'essaie d'exécuter le programme
Bon alors tout d'abord, Im assez nouveau pour la programmation, j'ai seulement lu un peu de choses et ont travaillé sur un projet d'Euler problèmes pour envelopper ma tête autour de concepts et de ces. Cependant, j'ai eu un message d'erreur aujourd'hui que je ne pouvais pas donner un sens j'ai donc pensé que je pourrais demander ici de l'aide! Des liens ou des conseils est apprécié!
Voici le message d'erreur:
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr Aborted
Donc, tous les conseils que vous pourriez avoir serait génial! Si vous avez besoin de voir mon code ou avez des questions, posez-les! Mais je préfère essayer de comprendre le problème, puis de trouver la réponse moi-même! Merci!
EDIT: Bon, puisque vous les gars, vous dites que vous auriez besoin de voir le code ici, il est.
#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;
}
- poster le code serait sympa!
- Vous essayez d'accéder à un élément, avec un index, plus grande que la taille de la chaîne ?
- Nous sommes tous assez nouveau pour la programmation, mais nous avons compris que cela a à voir avec le code source. Avez-vous une?
- Toutes les réponses ici peut faire bien juger des suppositions sur ce qui est mal, mais aucun ne peut point le problème, sauf si vous postez votre code source.
Vous devez vous connecter pour publier un commentaire.
Comme d'autres réponses ont déjà souligné, dans
substr
Si la position adoptée est passé à la fin de la chaîne, d'un out_of_range exception est levée.
Dans votre code:
Quand
i
est1
moins des_testnum.length()
j
va passés_testnum.length()
et quand vous le faites,s_testnum.substr(j, 1);
provoque une out_of_range exception.i < s_testnum.length()-4
puis j maximum sera de moins dei+4
, doncj
ne serait jamais aller au-delà de la gamme des_testnum
. Donc Oui, cela affecte la fonctionnalité que vous souhaitez atteindre? Je vous laisse pour vous de réfléchir.De Référence C++ pour substr,
Donc j'imagine votre appel
substr
avec un premier paramètre qui est plus grand que les chaînes de longueur.Depuis que vous avez posté votre code, vous pouvez le voir,
i
peut être d'un maximum des_testnum.length()-1
,mais
j
va jusqu'ài+4-1
=s_testnum.length()+2
.Vous appelez
substr
avec un premier paramètre dej
qui comme l'a dit peut être plus longue que la longueur de la chaîne. Donc, il y a le problème.Veuillez poster votre code en question. Les Chances sont que vous avez quelque chose comme:
Vous appelez
substr
avec des paramètres invalides - vous essayez d'obtenir élément de la chaîne, qui n'y est pas - par exemple en essayant de prendre le 10e char, lorsque la chaîne ne dispose que de 5.Dans votre cas, cela est causé par
substr
- vous essayez d'obtenir une sous-chaîne, qui est trop long pour le fait de la position de départ et il "sort" de la vraie chaîne.^^^^ dit, que vous avez une exception non interceptée, c'est-à
out_of_range
^^^^ C'est le texte de l'exception - note
substr
Plus probable que le paramètre de la
substr
vous avez appelé la fonction sur une chaîne de caractères dans votre code est passé par la longueur de la chaîne. D'où lastd::out_of_range
exception. Mais il est difficile de dire sans regarder le code. Aussi, vous pouvez parcourir le code et le corriger vous-même à l'aide d'un débogueur comme gdb/ddd. Assurez-vous simplement de compiler votre code avec l'indicateur g sur g++.Vous devriez être en mesure d'organiser pour votre débogueur pour casser quand une exception est levée. Exécuter le programme sous le débogueur, déterminer le point d'arrêt, et de regarder la pile walkback. (Pour mémoire, les touches Ctrl+Alt+E doit apparaître une boîte de dialogue à l'exception des options de gestion dans Visual Studio; la commande
catch throw
active un point d'arrêt sur une exception en vertu de l'gdb
.)