gpt4 book ai didi

c++ - 使用\in 字符串作为文字而不是转义符

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:26 25 4
gpt4 key购买 nike

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;
}

所以现在的问题是:当我在 stringMatch 函数中调试时,Xcode 没有读入 '\',expr 似乎只是 'asb' 而不是文字 a\sb'。

Xcode 在该行发出警告: string a = "a\sb": 未知转义序列

编辑:我已经尝试过使用“a\\sb”,它按原义读为“a\\sb”。

最佳答案

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 不要将反斜杠用作转义序列。

这些是常见的转义序列:

  • \a - 铃(哔)
  • \b - 退格键
  • \f - 换页
  • \n - 新行
  • \r - 回车
  • \t - 水平制表符
  • \\- 反斜杠
  • \' - 单引号
  • \"- 双引号
  • \ooo - 八进制表示
  • \xdd - 十六进制表示

编辑 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 作为参数或作为私有(private)成员在方法之间传递时,它将按字面意义使用额外的反斜杠。你必须考虑到这个事实来设计你的代码,以便它忽略额外的反斜杠。如何处理字符串取决于您。

编辑 3: 编辑 1 是您的最佳答案,但这是另一个。

stringMatch() 方法中添加代码,用单反斜杠替换双反斜杠。

您只需要在函数的最开始添加这一行:

expr=[expr stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];

这应该可以解决双反斜杠问题。

编辑 4:有些人认为 Edit 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:如果您将 stringMatch() 中的 const char * 更改为“string”,它对您来说就不那么复杂了。

expr.replace(/*size_t*/ pos1, /*size_t*/ n1, /*const string&*/ str );

编辑 6: 从 C++11 开始,存在类似 raw string literals 的东西.这意味着您不必转义,而是可以编写以下内容:

string a = R"raw(a\sb)raw";

请注意,字符串中的 raw 可以替换为您选择的任何分隔符。这适用于您想要在实际字符串中使用像 )raw 这样的子字符串的情况。当您必须大量转义字符时,使用这些原始字符串文字主要有意义,例如与 std::regex 结合使用。

附言您现在有了所有的答案,所以您要决定实现哪一个会带来最好的结果。

关于c++ - 使用\in 字符串作为文字而不是转义符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44921967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com