2017-04-20 12 views
-1

私はC++でプログラミングを学んでいます。私の宿題では、ユーザーが指定した3つの文字列をプロンプトで比較する必要があります。値を返す代わりに特定の値を直接変更する関数では、ポインタを使用する必要があることはわかっています。また、文字列はすでにポインタのように振る舞います。これは、これまでの私のコードですが、私が間違っているところわからない。:文字列を関数に渡す方法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){ 

charアレイへのstringのラップポインタながら、彼らは値ではなく、ポインタのように振る舞います。値で受け取った場合、新しいメモリブロックが割り当てられ、文字列の完全な内容がコピーされます。だからこそ可能ならば、参照セマンティクスが必要なのです。さもなければ、あなたは不必要なコピーをたくさん作っています。あなたはCスタイルの文字列リテラルとchar配列を考えているかもしれませんが、それらは最初の文字へのポインタとして渡されますが、真のC++ std::stringには当てはまりません。

あなたがC++ 11にはいないのであればあなたはstd::swap from <utility><algorithm>を使用して明示的な一時的なflagオブジェクトをも避けることができますが、あなたは本当に今ではC++ 11にする必要があります。あらかじめC++ 11 C++をされた書き込みただむやみ自虐この時点で):

void switching (string& x, string& y){ 
    if (x>y) std::swap(x, y); 
} 
関連する問題