2010-04-16 4 views
0
#include <iostream> 
#include <string> 
using namespace std; 
int main(void) 
{ 
    string a; 
    cin>>a; 
    a.erase(a.end()-1); 
    a.erase(a.begin()+1); 
    string ge = "oae"; 
    a.insert(a.begin()+1, ge); 
    cout<<a<<endl; 
    return 0; 
} 

Il ne compile pas et je ne sais pas pourquoi. Pouvez-vous me dire ce qui ne va pasQuel est le problème avec le code suivant?

+5

Quelle est l'erreur compilateur vous donne? –

+0

Aussi, quel compilateur? Il est possible que vous utilisiez un compilateur non standard ou avec des options qui le font se comporter de manière non standard. –

Répondre

3

http://www.cplusplus.com/reference/string/string/insert/

string& insert (size_t pos1, const string& str); 
string& insert (size_t pos1, const string& str, size_t pos2, size_t n); 
string& insert (size_t pos1, const char* s, size_t n); 
string& insert (size_t pos1, const char* s); 
string& insert (size_t pos1, size_t n, char c); 
iterator insert (iterator p, char c); 
    void insert (iterator p, size_t n, char c); 
template<class InputIterator> 
    void insert (iterator p, InputIterator first, InputIterator last); 

Votre appel à std::basic_string<t>::insert ne correspond à aucune des surcharges ci-dessus.

a.insert(a.begin()+1, ge); 

doit être

a.insert(a.begin()+1, ge.begin(), ge.end()); 

ou

a.insert(1, ge); 

Sinon, ce code n'est pas valide.

1

a.insert(a.begin()+1, ge); est le problème.

La fonction string::insert prend un int comme premier paramètre, et vous passez dans un itérateur. Qu'essayez-vous de faire?

+1

Aucune surcharge de std :: basic_string :: insert prend un paramètre int. Certaines surcharges prennent les paramètres 'size_t', mais aucune ne prend un int. –

+0

@Billy: intéressant, mon compilateur a craché: erreur C2664: 'std :: basic_string <_Elem, _Traits, _Ax> & std :: base_string <_Elem, _Traits, _Ax> :: insérer (unsigned int, const std :: basic_string <_Elem, _Traits, _Ax> &) ': impossible de convertir le paramètre 1 de' std :: _ String_iterator <_Elem, _Traits, _Alloc> 'en' unsigned int ' Je suppose que j'aurais dû dire "unsigned int". – David

+0

Size_t est un typedef pour un entier non signé sur votre compilateur. La norme ne le définit pas de cette façon, cependant. Cela peut être non signé long, ou long non signé, ou non signé court, ou tout autre type similaire et conforme à la norme. –

1

version de travail:

#include <iostream> 
#include <string> 
using namespace std; 
int main(void) 
{ 
    string a; 
    cin>>a; 
    a.erase(a.end()-1); 
    a.erase(a.begin()+1); 
    string ge = "oae"; 
    a.insert(1, ge);   // here 
    cout<<a<<endl; 
    return 0; 
} 
+0

+1 parce que c'est correct et que vous êtes nouveau, mais à l'avenir, vous ne serez pas susceptible d'être upvoted juste pour l'affichage du code corrigé. Vous devez expliquer pourquoi le code était incorrect pour commencer. –

1

Il n'y a pas de surcharge std::string::insert() qui prend un itérateur et string ensemble de paramètres. Vous pouvez choisir au lieu d'utiliser:

a.insert(1, ge); // use an index and a string 

ou:

a.insert(a.begin()+1, ge.begin(), ge.end()); // use an destination iterator, and 
               // a set of iterators indicating a range 

Notez que cela permettra à votre code pour compiler, mais il peut avoir des problèmes d'exécution, tels que:

  • si a est une chaîne vide, alors a.end()-1 est non défini
  • si a est une chaîne vide, puis a.begin()+1 est de même indéfini