2017-04-20 74 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); 
} 
相关问题