2017-04-20 4 views
-1

Ich lerne gerade Programmierung in C++. In meinen Hausaufgaben muss ich drei Strings vergleichen, die der Benutzer durch eine Eingabeaufforderung erhält. Ich weiß, dass für eine Funktion, um bestimmte Werte direkt zu ändern, anstatt einen Wert zurückzugeben, ich Zeiger verwenden muss. Ich weiß auch, dass Strings sich bereits wie Zeiger verhalten. Das ist mein Code so weit, aber ich weiß nicht, wo ich falsch:wie man einen String durch eine Funktion übergeben C++

#include"std_lib_facilities.h" 

void switching (string x, string y){ 
     string flag; 
     if (x>y){flag=y; 
       y=x; 
       x=flag; 
     } 

} 

int main(){ 
     string s1, s2, s3; 
     cout<<"introduce three words: "; 
     cin>>s1>>s2>>s3; 
       switching(s1,s2); 
       cout<<s1<<" "<<s2<<" "<<s3; 
       cout<<endl; 
       switching(s2,s3); 
       cout<<s1<<" "<<s2<<" "<<s3; 
       cout<<endl; 
       switching(s1,s2); 
       cout<<s1<<" "<<s2<<" "<<s3; 
       cout<<endl; 
     return 0; 
} 
+3

Sie müssen Pass-by-reference, dh 'Leere Schalt (string & x, string & y) {' – songyuanyao

+1

"Strings verhalten sich schon wie Zeiger" - was? – aschepler

+0

'std :: string' * enthält * einen Zeiger, ist aber selbst kein Zeiger. 'string x' ist eine Instanz, kein Zeiger auf eine Instanz. 'string * x' ist ein Zeiger auf eine Instanz. –

Antwort

3

Ihre Funktion ist die Saiten nach Wert (Kopien), nicht durch Verweis (oder Zeiger) empfängt, so kann es nicht führen Sie den Tausch tatsächlich durch, den Sie versuchen zu machen. Erhalten Sie die Parameter durch Verweis stattdessen durch den Prototyp Wechsel zu:

void switching (string& x, string& y){ 

Für die Aufzeichnung während string s Wrap Zeiger auf char Arrays, sie wie Werte verhalten, keine Zeiger; Wenn Sie sie als Wert erhalten, weisen sie einen neuen Speicherblock zu und kopieren den vollständigen Inhalt der Zeichenfolge hinein. Deshalb wollen Sie, wenn überhaupt, eine Referenzsemantik; Ansonsten machen Sie viele unnötige Kopien. Möglicherweise denken Sie an C-String-Literale und char Arrays, die als Zeiger auf ihr erstes Zeichen übergeben werden, aber das gilt nicht für echte C++ std::string s.

Sie können auch das explizite temporäre vermeiden flag Objekt mit std::swap from <utility> (<algorithm>, wenn Sie nicht auf sind C++ 11, aber Sie sollten wirklich sein auf C++ 11 jetzt, Schreiben pre-C++ 11 C++ ist gerade an dieser Stelle unnötig masochistisch):

void switching (string& x, string& y){ 
    if (x>y) std::swap(x, y); 
} 
Verwandte Themen