如何通过函数c ++传递字符串

时间:2017-04-20 01:35:28

标签: c++ c++11 c++14

我只是在学习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;
}

1 个答案:

答案 0 :(得分:3)

您的函数是按值(副本)接收字符串,而不是通过引用(或指针)接收字符串,因此它实际上无法执行您尝试执行的交换。通过引用接收参数,而不是将原型更改为:

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

对于记录,当string包装指向char数组的指针时,它们的行为类似于值,而不是指针;如果按值接收它们,它们将分配一个新的内存块并将字符串的完整内容复制到其中。这就是为什么你想要参考语义,如果可能的话;否则,你会制作大量不必要的副本。你可能会想到C风格的字符串文字和char数组,它们作为第一个字符的指针传递,但这不适用于真正的C ++ std::string

如果你不在C ++ 11上,你也可以使用std::swap from <utility>flag来避免显式的临时<algorithm>对象,但是你真的应该在C ++ 11上现在;编写pre-C ++ 11 C ++在这一点上是不必要的自虐:)

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