如何检测字符串中的转义

How to detect an escape in a string

本文关键字:字符串 转义 检测 何检测      更新时间:2023-10-16

我正在尝试做这样的事情:

#include <iostream>
std::string message = "Hellor"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;
}

我知道从逻辑上讲这是对的,但如果你理解我想做什么,你会注意到我想知道字符串上是否有转义。如果角色是转义,请执行您在上面看到的操作(开关)。

这可能吗?谢谢。

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

  1. H
  2. e
  3. l
  4. l
  5. o
  6. CR(ASCII 字符 13)
  7. "(ASCII 字符 34)
  8. w
  9. o
  10. r
  11. l
  12. d
  13. "(ASCII 字符 34)

这个字符串常量碰巧是通过转义序列创建的,这一事实是完全不可逆转的,因为这只是创建上述字节的编译器简写。 内存中不存在反斜杠,因此在运行时无法检测这些转义序列。

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

正如 Mike 所发布的那样,字符串转义是一种在编程语言中将不可打印字符键入字符串的方法。 转义本身实际上并不在带有的字符串中。 'n' 表示的字符是字符串中的内容。 因此,你想要这样的东西吗?

#include <iostream>
#include <cctype>
std::string message = "Hellor"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 '': 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
"a" //raw ASCII
"n0n141" //octal - ASCII
"x0x61" //hexidecimal - ASCII
"u0061" //codepoint - UTF16