std::string::find返回结果异常问题咨询
问题分析与解决
你的猜测完全正确!"\200"在C++字符串里确实被解析成单个字符,这就是为什么find返回索引8的原因。
先拆解你的字符串结构
我们逐个分析haystack里的每个字符(注意C++字符串的转义规则):
"ab":两个普通字符'a'、'b'(索引0、1)"\\x10":这里的第一个\是转义符,所以实际存储的是'\'和'x'、'1'、'0'四个字符(索引2、3、4、5)"c":普通字符'c'(索引6)"\200":这是八进制转义序列,\后面跟1-3个八进制数字(200是八进制,对应十进制128,十六进制0x80),所以这是单个字节的字符(索引7)"\\x00":同样,每个\\代表一个字面量'\',所以这部分是'\'、'x'、'0'、'0'四个字符,第一个这样的序列起始索引就是8——这正好是你的程序输出的结果。
如何让find按你的预期处理?
看起来你希望把"\200"当成四个字面量字符('\'、'2'、'0'、'0')来处理,而不是转义后的单个字符。要实现这个,你需要把字符串里的转义反斜杠改成双反斜杠,这样编译器就会把它当作普通的反斜杠字符,而不是转义序列的开头:
修改后的代码如下:
#include <string> #include <stdio.h> int main(int argc, char **argv) { // 把\200改成\\200,让每个反斜杠都作为字面量存在 std::string haystack = "ab\\x10c\\200\\x00\\x00\\x00\\x00"; std::string needle = "\\x00"; printf("first index is %d\n",(int) haystack.find(needle)); return 0; }
此时haystack里的\\200会被解析成四个独立字符,你运行程序后会得到预期的索引值(10,因为原来的索引7位置变成了四个字符,后面的\\x00起始位置就后移到了10)。
额外提示
如果你使用的是C++11或更高版本,还可以用原始字符串字面量来避免大量的双反斜杠,写法更直观:
std::string haystack = R"(ab\x10c\200\x00\x00\x00\x00)";
原始字符串里的所有字符都会被当作字面量,不需要转义反斜杠,非常适合处理这类包含大量转义符的字符串。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

