有没有办法获取表示特殊字符的字符串的 ascii 值?
Is there a way to get ascii value of a string representing a special character?
我正在开发一个编译器,我只是希望能够以我的语言读取文字 '\n'
,因为它是 ascii 值 (10
)。
但实际上还有更多的转义序列,如 \n
,我不想在 C++ 已经完全能够做到这一点的情况下尝试自己解释所有这些。
我基本上需要一种方法来获取 array/string:
const char* s1 = {'\'/* a simple slash */, 'n', '[=10=]'}; // "\n"
std::string s2 = "\x002b"; // {'\', 'x', '0', '0', '2', 'b', '[=10=]'}
并像 C/C++ 编译器那样对待它。
我想要一个标准函数来完成它,或者如果在运行时我可以与 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)
谢谢。
因此,在 Remy Lebeau 的评论和重新思考之后,我决定编写自己的代码来处理 C/C++ 编译器的大部分功能。
使用 here 中的特殊字符 table 我决定不实现长度超过 1 个字符的特殊字符,因为我很懒。
剩下 \n \t \v \b \r \f \a \ \? \' \" [=11=]
.
那是我的代码:
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 = "[=10=]"; break;
default:
break;
}
}
if (v.size() > 1) printf("ERROR_CHAR_TOO_LONG"); exit(-1);
return v[0];
}
我正在开发一个编译器,我只是希望能够以我的语言读取文字 '\n'
,因为它是 ascii 值 (10
)。
但实际上还有更多的转义序列,如
\n
,我不想在 C++ 已经完全能够做到这一点的情况下尝试自己解释所有这些。我基本上需要一种方法来获取 array/string:
const char* s1 = {'\'/* a simple slash */, 'n', '[=10=]'}; // "\n"
std::string s2 = "\x002b"; // {'\', 'x', '0', '0', '2', 'b', '[=10=]'}
并像 C/C++ 编译器那样对待它。
我想要一个标准函数来完成它,或者如果在运行时我可以与 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)
谢谢。
因此,在 Remy Lebeau 的评论和重新思考之后,我决定编写自己的代码来处理 C/C++ 编译器的大部分功能。
使用 here 中的特殊字符 table 我决定不实现长度超过 1 个字符的特殊字符,因为我很懒。
剩下 \n \t \v \b \r \f \a \ \? \' \" [=11=]
.
那是我的代码:
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 = "[=10=]"; break;
default:
break;
}
}
if (v.size() > 1) printf("ERROR_CHAR_TOO_LONG"); exit(-1);
return v[0];
}