résilier appelé après avoir jeté une instance de 'std::out_of_range' ce(): basic_string::substr
J'ai reçu ce message d'erreur: "résilier appelé après avoir jeté une instance de 'std::out_of_range'
ce(): basic_string::substr" à partir de ce code:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cstdlib>
using namespace std;
vector <string> n_cartelle;
ifstream in("n_cartelle.txt");
string linea;
while(getline(in,linea))
n_cartelle.push_back(linea);
for(int i=0; i < 4; ++i){
if(n_cartelle[i].substr(n_cartelle[i].size()-3) == "txt")
cout <<"si"<<endl;
else
cout<<"no"<<endl;
}
Si j'essaie avec ceci:
if(n_cartelle[7].substr(n_cartelle[7].size()-3) == "txt")
cout <<"si "<<n_cartelle[7]<<endl;
else
cout<<"no"<<endl;
Je n'ai pas l'erreur.
- Je n'ai pas de problème pour compiler ce code, mais pour exécuter dans windows 7 pro.
- La taille de la chaîne à partir de laquelle vous essayez d'extraire la sous-chaîne est probablement moins de 3 caractères. Imprimer la chaîne, et il est de taille à l'intérieur de la
for
avant d'essayer d'extraire la sous-chaîne. - c'est probablement, oui
Vous devez vous connecter pour publier un commentaire.
Ce que vous l'expérience est probablement un cas d'exception tomber
main()
, qui termine le programme et donne un OS spécifique à un message d'erreur comme celui que vous avez posté.Comme première mesure, vous pouvez intercepter des exceptions dans
main()
. Cela permettra d'éviter votre programme à partir de la plante.Maintenant que vous avez ce mécanisme mis en place, vous pouvez effectivement traquer l'erreur.
En regardant ton code, il pourrait être que
n_cartelle
a moins de 4 éléments, causée peut-être par n_cartelle.txt ne contenant que 3 lignes. Cela signifierait quen_cartelle[0]
,n_cartelle[1]
etn_cartelle[2]
serait bien, mais en essayant d'accéder àn_cartelle[3]
et rien au-delà serait un comportement indéterminé, ce qui signifie essentiellement que rien peut arriver. Donc, assurez-vous d'abord quen_cartelle
a en fait 4 éléments et que votre programme a défini les comportements.La prochaine chose qui pourrait aller mal (plus probable, pour être honnête) est votre
substr()
appel. Lorsque vous essayez d'appelersubstr()
avec "impossible" des arguments, par exemple l'obtention de la sous-chaîne commençant à caractère 10 d'une chaîne de caractères ne contenant que 5 caractères, alors le comportement est une erreur définie par l' - unstd::out_of_range
exception est levée. La même chose arrive (indirectement, presque à chaque fois) accidentellement lorsque vous essayez de passer un nombre négatif comme premier argument desubstr()
. En raison du fonctionnement interne d'unestd::string
, un nombre négatif serait converti en un énorme nombre positif, certainement beaucoup plus que la corde, et le résultat dans le mêmestd::out_of_range
exception.Donc, si l'un de vos lignes a une longueur de moins de 3 caractères,
size() - 3
est négatif et ce que je viens de vous expliquer arrive.