2010-10-06 7 views
1

j'ai le code suivantqu'est-ce qui ne va pas dans ce code?

#include <iostream> 
#include <string> 
using namespace std; 
string replace(string s){ 

    for (int i=0;i<s.length();i++){ 
     if (s[i]> 'b' && s[i]<'f'){ 
      s.erase(s[i]); 

     } 

    } 
    return s; 
} 
int main(){ 

    string s; 
    cin>>s; 
    cout<<replace(s)<<endl; 


    return 0; 

} 

si j'entre géorgie il me montrer exception "abort a été appelé" pourquoi?

+0

ce ereOn dit et aussi vous avez un bug. si vous avez par exemple "cca", seul le premier c sera supprimé. –

+0

@Pasi Savolainen: Si vous entrez «cca» dans son code, il appelle un comportement indéfini. – ereOn

Répondre

6

std::string::erase() prend une paire d'index, ou des itérateurs.

Regardez this link.

Ici s[i] donne un caractère, qui est par erreur converti en size_t donc, en fonction de votre chaîne, vous essayez en fait de supprimer un élément qui n'existe pas.

Une solution plus propre serait:

#include <string> 
#include <iostream> 
#include <cstdlib> 

bool should_be_removed(char c) { return (c > 'b') && (c < 'f'); } 

int main() 
{ 
    std::string s; 
    std::cin >> s; 
    s.erase(std::remove_if(s.begin(), s.end(), should_be_removed), s.end()); 

    return EXIT_SUCCESS; 
} 
+0

Belle solution, mais ne devrait pas 'remove_if' être appelé' partition' ou quelque chose, car il ne supprime réellement rien écrou déplace simplement les choses sur un peu. Il y a probablement une très bonne raison pour ce nom. – Skizz

+1

@Skizz: il ne déplace pas nécessairement les éléments "supprimés", il déplace juste les éléments qui ne correspondent pas. Les valeurs des éléments après l'itérateur renvoyé par 'remove_if' sont indéfinies. – ereOn

+0

oui, vous avez raison. J'ai dû relire attentivement la spécification de 'remove_if'. – Skizz

Questions connexes