Equality-test std :: string对char *,运算符==()总是安全吗?

时间:2014-03-28 10:52:14

标签: c++

std::string的STL运算符和重载是否意味着使用operator==char*std::string进行比较是安全的,没有限制,即LHS / RHS?

3 个答案:

答案 0 :(得分:2)

不,没有限制的是不安全的。 限制是:

  • char*不能是空指针。
  • char*指向的字符序列必须为零分隔(即以\0结尾)

但是你放哪一个以及哪一个正确并不重要 - 它会给出相同的结果。

但有一点需要注意:std::string可能包含不在最后的\0个字符。将其中一个与char*字符序列进行比较将始终为false,因为比较将在\0中遇到的第一个char*处停止。

示例:

char c[] = "Hello\0 World!";
std::string s(c, sizeof(c));

std::cout << ((s == c) ? "ok" : "meh") << '\n';  //meh    - compares only until the first \0
std::cout << c << '\n';                          //Hello  - cout also stops at first \0
std::cout << s << '\n';                          //Hello World!

答案 1 :(得分:1)

是的,只要您确定char *不是空指针,并且它是以空值终止的,它就是安全的。

答案 2 :(得分:1)

std::string可以包含多个空字符。但operator==std::string的{​​{1}}定义为

  

将字符串的内容与另一个字符串或a进行比较   以空值终止的CharT数组。

该问题的示例:

char*

如果std::string a = "hello"; char* b = "hello\0fellow\0"; bool equals = (a == b); // will give true, though a and b are not the same 字符串未以空值终止,则可能会出现另一个问题。