(Désolé si mes sentances sont pleines de mystakes, je ferai de mon mieux pour écrire quelque chose de lisible) Salut, je travaille sur une fonction qui lit un fichier et stocke chaque ligne dont le premier char est ":" et supprime chaque tiret contenu dans la chaîne. Chaque fois que ce type de ligne est trouvé, push_back() est utilisé pour stocker cette ligne dans un vecteur. Le problème est que chaque fois que push_back() est utilisé, tous les éléments du vecteur prennent la valeur du dernier. Je ne comprends pas pourquoi cela arrive. Voici le code:std :: vecteur fait chose étrange
string listContent;
size_t dashPos;
vector<char*>cTagsList;
while(!SFHlist.eof())
{
getline(SFHlist,listContent);
if(listContent[0]==':')
{
listContent.erase(0,1);
dashPos = listContent.rfind("-",string::npos);
while(dashPos!=string::npos)
{
listContent.pop_back();
dashPos = listContent.rfind("-",string::npos);
}
char* c_listContent = (char*)listContent.c_str();
cTagsList.push_back(c_listContent);
}
}
J'ai d'abord pensé qu'il avait un problème avec la fin du fichier, mais le processus de l'interruption recherche avant d'arriver à ce point donne les mêmes résultats.
Tout d'abord, [ 'while (! Eof())' est faux.] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) Deuxièmement, transtyper le résultat de 'c_str' en' char * 'est très mauvais. Troisièmement, ce pointeur est invalide dès que vous modifiez la chaîne, ce qui arrive juste après. Utilisez un vecteur de 'std :: string'. De toute façon, vous ne supprimez pas tous les tirets, vous supprimez tout après et y compris le premier tiret. Utilisez 'std :: remove' et associez-le avec' erase'. – chris
Ne stockez pas les résultats de 'c_str'! Au lieu de cela, faites juste 'std :: vector cTagsList;' à la place et juste 'cTagsList.push_back (listContent);' –
crashmstr
utilisez char * uniquement lorsque vous traitez avec c pur, vous avez des chaînes en C++ – blade