比较字符串忽略空

问题描述 投票:-1回答:3

我想比较两个std::strings"abc\0""abc"。有没有办法忽略一个字符,在这种情况下'\0'(NUL),比较时?

现在我在做与后NUL的字符串pop_back()删除它,但必须有一个更好的方式来处理这个问题。

c++ string stl
3个回答
1
投票

如果空终止总是在最后,你可以使用std::strcmp

否则,你可以自己编写循环遇到终止时迭代字符串和比较字符,特殊规则。

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


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

-1
投票

与C风格的字符串,NULstd::string有效字符,将被视为没有区别其它字符。

因此,如果你的std::strings的一个后缀一个NUL性格和,这是不是你想要的,你可能应更好地弄明白为什么NUL被列入首位。

如果你不能找到源并修复它,一般有两种解决方法。

(1)比较之前剪裁字符串

您可以使用来自第三方库,例如trim()般的功能促进;或写自己的实现。

该功能只会删除NUL字符(S)。

(2)在C语言风格的比较字符串

使用std::string::c_str()获得C风格的字符串,然后使用功能类似strcmp做对比。

请注意,如果在字符串中间的NUL字符,像ab\0c,这种解决办法将提供你一个不正确的结果。

© www.soinside.com 2019 - 2024. All rights reserved.