作为文字而不是一种逃避的字符串使用\\(using \\ in a string as litera

2019-06-17 21:07发布

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”,而不是字面\某人。

和Xcode是吐出在该行的警告:字符串=“A \ SB”:未知转义序列

编辑:使用“A \\ SB”我已经尝试,它为“\\ SB”的字面读英寸

Answer 1:

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规定不通过添加额外的反斜线你的字符串使用反斜杠作为转义序列。

这些都是常见的转义序列:

  • \一个 - 贝尔(嘟嘟)
  • \ b - 退格
  • \的F - 换页
  • \ N - 新线
  • \ r - 回车
  • \ t - 水平制表
  • \\ - 反斜杠
  • \” - 单引号
  • \” - 双Quatation马克
  • \ 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的方法作为参数之间或私有成员,那么它会采取额外的反斜线字面。 你有那么它忽略额外的反斜杠来设计你的代码考虑到这一事实。 这是你高达你如何处理字符串。

编辑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()为“string`它会为你那么复杂。

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

PS你现在有所有的答案,所以你高达你实现这一个,给你最好的结果是。



Answer 2:

Xcode是吐出的警告,因为它是解释\s在“A \ SB”作为转义序列,但\s不是一个有效的转义序列。 它得到与刚刚更换s因此字符串变成“ASB”。

逃离像反斜杠"a\\sb"是正确的解决方案。 如果这有点不为你工作,请发表一下细节。

下面是一个例子。

#include <iostream>
#include <string>

int main() {
    std::string a = "a\\sb";
    std::cout << a.size() << ' ' << a << '\n';
}

这个程序的输出如下:

如果你得到不同的输出请张贴。 还请张贴正是你观察到的问题,当你试图“一\\ SB”更早。


Regexs可以在C ++的痛苦,因为反斜杠必须进行转义这种方式。 C ++ 11具有不允许任何种类的逃逸,使得逸出反斜杠是不必要的原始字符串: R"(a\sb)"



文章来源: using \\ in a string as literal instead of an escape