我想比较两个std::strings
,"abc\0"
和"abc"
。有没有办法忽略一个字符,在这种情况下'\0'
(NUL),比较时?
现在我在做与后NUL的字符串pop_back()
删除它,但必须有一个更好的方式来处理这个问题。
如果空终止总是在最后,你可以使用std::strcmp
。
否则,你可以自己编写循环遇到终止时迭代字符串和比较字符,特殊规则。
效率较低的版本可以纯粹使用标准的算法来实现:创建每个字符串除去了终止子(std::copy_if
)的副本,然后使用std::string
的比较运算符。
如果你比较两个字符串,长度为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
与C风格的字符串,NUL
是std::string
有效字符,将被视为没有区别其它字符。
因此,如果你的std::string
s的一个后缀一个NUL
性格和,这是不是你想要的,你可能应更好地弄明白为什么NUL
被列入首位。
如果你不能找到源并修复它,一般有两种解决方法。
(1)比较之前剪裁字符串
您可以使用来自第三方库,例如trim()
般的功能促进;或写自己的实现。
该功能只会删除NUL
字符(S)。
(2)在C语言风格的比较字符串
使用std::string::c_str()
获得C风格的字符串,然后使用功能类似strcmp
做对比。
请注意,如果在字符串中间的NUL
字符,像ab\0c
,这种解决办法将提供你一个不正确的结果。