bool stringMatch(const char *expr, const char *str) {
// do something to compare *(expr+i) == '\\'
// In this case it is comparing against a backslash
// i is some integer
}
int main() {
string a = "a\sb";
string b = "a b";
cout << stringMatch(a.c_str(), b.c_str()) << endl;
return 1;
}
所以现在的问题是:Xcode没有在'\'中读取,当我在stringMatch函数中调试时,expr只出现'asb'而不是文字a \ sb'。
Xcode在线上吐出警告: string a =“a \ sb”:未知的转义序列
编辑:我已经尝试过使用“a \\ sb”,它以“a \\ sb”的形式读作文字。
答案 0 :(得分:13)
bool stringMatch(const char *expr, const char *str) {
// do something to compare *(expr+i) == '\\'
// In this case it is comparing against a backslash
// i is some integer
}
int main() {
string a = "a\\sb";
string b = "a b";
cout << stringMatch(a.c_str(), b.c_str()) << endl;
return 1;
}
默认情况下,C和C ++将反斜杠作为转义序列处理。你必须通过在字符串中添加额外的反斜杠来告诉C不要使用反斜杠作为转义序列。
这些是常见的转义序列:
编辑: Xcode在您的计算机上运行异常。所以我可以建议你。
bool stringMatch(const char *expr, const char *str) {
// do something to compare *(expr+i) == '\\'
// In this case it is comparing against a backslash
// i is some integer
}
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: Edit 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); // Try and find the first match
next != std::string::npos; // next is npos if nothing was found
next = value.find(search,next) // search for the next match starting after
// the last match that was found.
)
{
// Inside the loop. So we found a match.
value.replace(next,search.length(),replace); // Do the replacement.
next += replace.length(); // Move to just after the replace
// This is the point were we start
// the next search from.
}
}
编辑5:如果您将const char *
中的stringMatch()
更改为“字符串”,那么对您来说就不那么复杂了。
expr.replace(/*size_t*/ pos1, /*size_t*/ n1, /*const string&*/ str );
<强> P.S。您现在拥有所有答案,因此您可以使用哪一个为您提供最佳结果。
答案 1 :(得分:7)
Xcode正在吐出该警告,因为它将“a \ sb”中的\s
解释为转义序列,但\s
不是有效的转义序列。它被s
替换,因此字符串变为“asb”。
像"a\\sb"
一样转义反斜杠是正确的解决方案。如果这对您不起作用,请发布更多详细信息。
这是一个例子。
#include <iostream>
#include <string>
int main() {
std::string a = "a\\sb";
std::cout << a.size() << ' ' << a << '\n';
}
该程序的输出如下:
如果您得到不同的输出,请发布。另外,请准确发布您之前尝试过“a \\ sb”时遇到的问题。
正则表达式可能是C ++的痛苦,因为必须以这种方式转义反斜杠。 C ++ 11有原始字符串,不允许任何类型的转义,因此不需要转义反斜杠:R"(a\sb)"
。