【问题标题】:Is there a way to get ascii value of a string representing a special character?有没有办法获取表示特殊字符的字符串的 ascii 值?
【发布时间】:2022-01-26 01:20:38
【问题描述】:

我正在开发一个编译器,我只是希望能够读取文字 '\n',因为它是我的语言中的 ascii 值 (10)。


但实际上还有更多的转义序列,例如 \n,当 C++ 已经完全能够做到这一点时,我不想尝试自己解释所有这些。

我基本上需要一种获取数组/字符串的方法:
const char* s1 = {'\\'/* a simple slash */, 'n', '\0'}; // "\\n"
std::string s2 = "\\x002b"; // {'\\', 'x', '0', '0', '2', 'b', '\0'}

并像 C/C++ 编译器那样对待它。


我想要一个 std 函数来完成它,或者如果在运行时我可以与 C++ 编译器交互并让它完成这项工作,就像这样:
char c1 = exec("'%s'", s1); // would return '\n' as one character (ascii 10)
char c2 = std::parse_char_literal(s2); // would return '+' (ascii 43)

谢谢。

【问题讨论】:

  • 无法按照您想要的方式与编译器进行交互。它在运行时不存在。您必须自己解析字符串。例如,您必须手动将字符序列 '\' 'n' 转换为数字 10。或者 std::stoi() 可以解析来自十六进制编码字符串的整数,例如 "0x002b"

标签: c++ char special-characters lexer


【解决方案1】:

所以在 Remy Lebeau 的评论和重新思考之后,我决定编写自己的代码来处理 C/C++ 编译器的大部分功能。
使用来自here 的特殊字符表,我决定不实现长度超过 1 个字符的特殊字符,因为我很懒。
剩下\n \t \v \b \r \f \a \\ \? \' \" \0


那是我的代码:
char escSeqToChar(std::string v)
{
    if (v[0] == '\\' && v.size() == 2)
    {
        switch (v[1])
        {
        case 'n':
            v = "\n"; break;
        case 't':
            v = "\t"; break;
        case 'v':
            v = "\v"; break;
        case 'b':
            v = "\b"; break;
        case 'r':
            v = "\r"; break;
        case 'f':
            v = "\f"; break;
        case 'a':
            v = "\a"; break;
        case '\\':
            v = "\\"; break;
        case '?':
            v = "\?"; break;
        case '\'':
            v = "\'"; break;
        case '\"':
            v = "\""; break;
        case '0':
            v = "\0"; break;
        default:
            break;
        }
    }
    if (v.size() > 1) printf("ERROR_CHAR_TOO_LONG"); exit(-1);

    return v[0];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多