如何检测字符串中的转义

时间:2014-03-04 22:56:04

标签: c++ c++11

我正在尝试做类似的事情:

#include <iostream>

std::string message = "Hello\r\"world\"";

int main() {
    if (message[5] == '\\') {
        switch (message[6]) {
            case 'r':
                std::cout << "\\r escape..." << std::endl;
            break;
            case '"':
                std::cout << "\" escape..." << std::endl;
            break;
        }
    }

    return 0;
}

我知道逻辑上是正确的,但是如果你明白我想要做什么,你会注意到我想知道字符串是否存在转义。如果角色是逃脱,请执行上面看到的(开关)。

这可能吗?谢谢。

2 个答案:

答案 0 :(得分:5)

这是不可能的。在运行时,字符串中将包含以下字节:

  1. ħ
  2. 电子
  3. 0
  4. CR (ASCII字符13)
  5. (ASCII字符34)
  6. 瓦特
  7. 0
  8. - [R
  9. d
  10. (ASCII字符34)
  11. 这个字符串常量发生通过转义序列创建的事实是完全无关紧要的,因为这只是编译器的简写来创建上述字节。在内存中不存在反斜杠的位置,因此运行时无法检测这些转义序列。

    当然,您可以查看字节6是否为13,或字节7是否为34。

答案 1 :(得分:2)

正如Mike所说,字符串转义是一种在编程语言中将输入不可打印字符转换为字符串的方法。转义本身实际上不在\的字符串中。 '\n'表示的字符是字符串中的字符。你好,你想要这样的东西吗?

#include <iostream>
#include <cctype>

std::string message = "Hello\r\"world\"";

int main() {
    switch (message[5]) {
        case '\\': std::cout << "\\\\ escape...\n"; break;
        case '\"': std::cout << "\\\" escape...\n"; break;
        case '\'': std::cout << "\\\' escape...\n"; break;
        case '\?': std::cout << "\\? escape...\n"; break;
        case '\a': std::cout << "\\a escape...\n"; break;
        case '\b': std::cout << "\\b escape...\n"; break;
        case '\f': std::cout << "\\f escape...\n"; break;
        case '\n': std::cout << "\\n escape...\n"; break;
        case '\r': std::cout << "\\r escape...\n"; break;
        case '\t': std::cout << "\\t escape...\n"; break;
        case '\v': std::cout << "\\v escape...\n"; break;
        case '\0': std::cout << "\\0 escape...\n"; break;
        default:
            if (isprint(message[5]))
                std::cout << message[5] << " is not an escape...\n";
            else {
                std::cout << "\\x";
                std::cout << std::hex << ((unsigned char)message[5]);
                std::cout << " escape...\n" << std::dec;
            }
            break;
    }

    return 0;
}

还有其他具有值参数的转义,并且无法以任何方式检测到它们,因为它们不是唯一的。

These are all identical after compilation
"\0a" //raw ASCII
"\n0\n141" //octal - ASCII
"\x0\x61" //hexidecimal - ASCII
"\u0061" //codepoint - UTF16