bool stringMatch(const char *expr, const char *str) {
}
int main() {
string a = "a\\sb";
string b = "a b";
cout << stringMatch(a.c_str(), b.c_str()) << endl;
return 1;
}
C和C++默认将反斜杠视为转义字符。你需要在字符串中加入额外的反斜杠来告诉C不要将你的反斜杠视为转义字符。
下面是常见的转义字符:
- \a - 响铃(蜂鸣)
- \b - 退格
- \f - 换页
- \n - 换行
- \r - 回车
- \t - 水平制表符
- \\ - 反斜杠
- \' - 单引号
- \" - 双引号
- \ooo - 八进制表示
- \xdd - 十六进制表示
编辑提示:在你的机器上,Xcode的行为异常。因此,我可以向你提供以下建议。
bool stringMatch(const char *expr, const char *str) {
}
int main() {
string a = "a" "\x5C" "sb";
string b = "a b";
cout << stringMatch(a.c_str(), b.c_str()) << endl;
return 1;
}
不用担心在声明
string a
时的空格,Xcode会将以空格分隔的字符串连接起来。
编辑2:实际上,Xcode会直接读取你的
"a\\b"
,这是它处理转义反斜杠的方式。当你将
string a = "a\\sb"
输出到控制台时,你会看到
a\sb
。但是当你将
string a
作为参数或私有成员在方法之间传递时,它会将额外的反斜杠解释为字面量。你需要设计你的代码来考虑这一点,使其忽略多余的反斜杠。你可以自行决定如何处理字符串。
编辑3:编辑1是你最佳的答案,但这里还有另一个方法。
在你的
stringMatch()
方法中添加代码,将双反斜杠替换为单反斜杠。
你只需要在函数的开头添加这一行即可。
expr=[expr stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];
这应该可以解决双反斜杠的问题。
编辑4:
有些人认为编辑3是ObjectiveC,因此不够优化,所以还有一种在ObjectiveC++中的选择。
void searchAndReplace(std::string& value, std::string const& search,std::string const& replace)
{
std::string::size_type next;
for(next = value.find(search);
next != std::string::npos;
next = value.find(search,next)
)
{
value.replace(next,search.length(),replace);
next += replace.length();
}
}
编辑5: 如果你将
stringMatch()
中的
const char *
改为
string`
,它会更简单易懂。
expr.replace( pos1, n1, str );
第6版编辑:从C++11开始,存在类似原始字符串字面值
的东西。
这意味着您不必转义,而可以编写以下内容:
string a = R"raw(a\sb)raw";
请注意,字符串中的
raw
可以被您选择的任何分隔符替换。这适用于实际字符串中想要使用子字符串(例如
)raw
)的情况。主要在需要经常转义字符时才使用这些原始字符串字面量,例如与
std::regex
结合使用。
顺便说一句,您现在拥有所有答案,所以您可以自己选择哪个实现方式可以给您带来最好的结果。