比较字符串时忽略NUL

时间:2019-02-11 16:24:44

标签: c++ string stl

我正在尝试比较两个std::strings"abc\0""abc"。 比较时是否可以忽略字符(在这种情况下为'\0'(NUL))?

现在我正在对带有结尾NUL的字符串进行pop_back()删除,但是必须有更好的方法来处理它。

3 个答案:

答案 0 :(得分:1)

如果空终止符始终位于结尾处,则可以使用std::strcmp

否则,您可以自己编写循环,以在遇到终止符时使用特殊规则来迭代两个字符串并比较字符。

可以仅使用标准算法来实现效率较低的版本:创建每个字符串的副本,并删除终止符(std::copy_if),然后使用比较std::string运算符。

答案 1 :(得分:0)

如果要比较两个字符串,长度为4 "abc\0"之一,而长度为3 "abc"之一,则它们当然不会比较相等。其中一个字符是NUL的事实在这里与之无关。

如果您要查看一个字符串是否与另一个字符串相同,只是它的末尾嵌入了NUL-可以这样写:

std::string s1{"abc\0", 4};
std::string s2{"abc"  , 3};
return s2.length() == s1.length() - 1 && // sizes differ by one char
       s1.back() == '\0' &&              // last char is a NUL
       s1.compare(0, s1.length() - 1, s2) == 0; // all the other ones are the same

答案 2 :(得分:-1)

与C风格的字符串不同,NULstd::string的有效字符,与其他字符没有区别。

因此,如果您的std::string中有一个后缀NUL,而这不是您想要的,则最好弄清楚为什么第一个中包含NUL地方。

如果您找不到源代码并进行修复,则有两种常规的解决方法。

(1)在比较之前修剪字符串

您可以使用第三方库中的类似trim()的函数,例如促进;或编写自己的实现。

此功能仅删除NUL个字符。

(2)比较C样式的字符串

使用std::string::c_str()获取c样式的字符串,然后使用类似strcmp的函数进行比较。

请注意,如果字符串中间有一个NUL字符,例如ab\0c,则此解决方法将为您提供错误的结果。