换言之,C和C++在字符串比较上有什么不同?
我来自“C”阵营。我看到一个程序使用==来比较字符串,我试图找到它的重载程序,但没有找到一个。这是否意味着C++会自然地使用==和!=处理字符串(char [])?
如果我有自己定义的字符串类,那么我可以使用==和!=而不定义它们吗?或者它只适用于char []?
编辑:
看起来我把C的char[]和C++ std::string类混在一起了。好了,这个老问题仍然适用。以下是一些问题:
我的程序定义了char[]变量,但与"==“运算符相比。看起来很管用。它们是C风格的字符串,但使用"==“。编译器是否为我自动将它们转换为std::string,这样程序就可以工作了?
Edit2:
这是一个有效的示例。
if(name == "") return;
其中"name“是一个MyString类项目。它有一个带参数char*的构造函数。
MyString有一个公共函数data(),它返回char* C样式的字符串指针。
那么,我是在比较MyString对象吗?或者C风格的字符串?
如果没有重载"!=“我自己,我能做一些类似下面的事情吗?
if( name.data() != somes_[i].data() )
....
发布于 2013-10-07 19:24:14
“这是不是意味着用==
和!=
__自然地处理string __?”
No。将C样式的字符串(即char[]
或char*
)与==
或!=
(在C和C++中)进行相互比较是错误的,因为您最终将比较指针而不是字符串。
在C++中,可以将std::string
对象与C样式的字符串或其他std::string
对象进行比较,因为std::string
的operator==
和operator!=
std::string str1("abc"), str2("def");
if (str1 != str2 && str1 == "abc")
std::cout << "Yep, I got it.";
发布于 2013-10-07 19:23:33
字符是否意味着C++使用==和!=自然地处理字符串(
[])?
不会;"aaa" == "aaa"
会像往常一样将字符串转换为char*
,并比较指针的值。然而,C和C++的大多数实现都将消除字符串文字数据的重复,至少在目标文件中是这样的,因此这些指针将是相同的。该标准不能保证这一点,但它得到了广泛的实现。
换句话说,在这一点上,C++与C没有什么不同,用这种方法比较char*
值并不比用C更好。
有没有帮我把它们自动转换成std::string,这样程序就能工作了?
std::string
重载了与char*
一起使用的比较运算符。如果您将char*
与std::string
进行比较,则将使用其中之一。
char const *s = "aaa";
std::string t = "aaa";
s == t; // uses overloaded operator== to compare string values.
http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp
template< class CharT, class traits, class Alloc >
bool operator==( const CharT* lhs, const basic_string<CharT,Traits,Alloc>& rhs );
发布于 2013-10-07 19:28:42
不要使用!=或!=比较C样式字符串(char *或char[])。
如果您确定字符串是以null结尾的,请使用std::strcmp()。如果您不能百分之百确定它们是以null结尾的,那么可以使用std::strncmp()来比较它们。
如果其中一个字符串是std::字符串,则可以使用运算符==或运算符!=。
根据来自barnes53的评论进行编辑
https://stackoverflow.com/questions/19232814
复制相似问题