2017-04-20 154 views
-1

我只是在用C++學習編程。在我的作業中,我需要通過提示比較用戶給出的三個字符串。我知道,對於直接修改某些值而不是返回值的函數,我需要使用指針。我也知道字符串已經像指針一樣。這是到目前爲止我的代碼,但我不知道我錯了:如何通過函數傳遞一個字符串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

你需要傳遞的引用,即'無效開關(字符串&X,串&Y){' – songyuanyao

+1

「字符串已經表現得像指針」 - 什麼? – aschepler

+0

'std :: string' *包含*指針,但本身不是指針。 'string x'是一個實例,而不是一個指向實例的指針。 'string * x'是一個指向實例的指針。 –

回答

3

你的功能是接收由值(副本)的字符串,而不是通過引用(或指針),因此它不能實際執行你正在嘗試做的交換。接收通過引用的參數通過代替改變原型:

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

對於記錄,而string S環繞指針char陣列,它們的行爲像值,而不是指針;如果您按值接收它們,它們將分配一個新的內存塊並將字符串的完整內容複製到內存中。這就是爲什麼你想盡可能引用語義;否則,你正在製作大量不必要的副本。你可能會想到C風格的字符串文字和char數組,它們會作爲第一個字符的指針傳遞,但這不適用於真正的C++ std::string s。

您也可以使用std::swap from <utility><algorithm>避免明確的臨時flag對象,如果你不是在C++ 11,但你真的應該對C++ 11現在;預寫C++ 11 C++是隻是在這一點上不必要自虐):

void switching (string& x, string& y){ 
    if (x>y) std::swap(x, y); 
} 
相關問題