我正在尝试比较两个std::strings
,"abc\0"
和"abc"
。
比较时是否可以忽略字符(在这种情况下为'\0'
(NUL))?
现在我正在对带有结尾NUL的字符串进行pop_back()
删除,但是必须有更好的方法来处理它。
答案 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风格的字符串不同,NUL
是std::string
的有效字符,与其他字符没有区别。
因此,如果您的std::string
中有一个后缀NUL
,而这不是您想要的,则最好弄清楚为什么第一个中包含NUL
地方。
如果您找不到源代码并进行修复,则有两种常规的解决方法。
(1)在比较之前修剪字符串
您可以使用第三方库中的类似trim()
的函数,例如促进;或编写自己的实现。
此功能仅删除NUL
个字符。
(2)比较C样式的字符串
使用std::string::c_str()
获取c样式的字符串,然后使用类似strcmp
的函数进行比较。
请注意,如果字符串中间有一个NUL
字符,例如ab\0c
,则此解决方法将为您提供错误的结果。