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