如何将字母字符转换为相应的转义特殊字符
How to convert a letter character into the corresponding escaped special character
我需要一个函数,它可以给我从字母字符中转义的特殊字符。它仅在有意义时适用:'t'、'n'、'r'、'b'、'f'、'v'.
现在,这是我的实现:
typedef struct SpecialCharacter
{
SpecialCharacter( char letter, char special )
{
m_letter = letter;
m_special = special;
}
char m_letter;
char m_special;
} SpecialCharacter;
typedef std::vector<SpecialCharacter> SpecialCharacters;
static const SpecialCharacters& GetSpecialCharacters()
{
static SpecialCharacters characters;
if ( characters.empty() )
{
characters.push_back( SpecialCharacter( 'b', '\b' ) );
characters.push_back( SpecialCharacter( 'f', '\f' ) );
characters.push_back( SpecialCharacter( 'n', '\n' ) );
characters.push_back( SpecialCharacter( 'r', '\r' ) );
characters.push_back( SpecialCharacter( 't', '\t' ) );
characters.push_back( SpecialCharacter( 'v', '\v' ) );
}
return characters;
}
static bool getEscaped( char letter, char& escaped )
{
for ( SpecialCharacters::const_iterator iter = GetSpecialCharacters().begin();
iter != GetSpecialCharacters().end();
++iter )
{
if ( letter == iter->m_letter)
{
escaped = iter->m_special;
return true;
}
}
return false;
}
我不喜欢向字符向量添加元素的方式:
characters.push_back( SpecialCharacter( 'b', '\b' ) );
有什么办法吗:
characters.push_back( SpecialCharacter( 'b' ) );
然后有类似的东西:
SpecialCharacter( char letter )
{
m_letter = letter;
m_special = '\' + letter; // does not work, of course!
}
我想要一种将“\”和 'n' 合并到“\n”中的方法,或者通过任何不同的方式从 'n' 中获取“\n”...
编辑:case 语句是我在将代码移动到结构向量之前最初拥有的语句(因为我需要一个函数来解决这个问题)。所以这不是解决我的问题的好方法。我想将 'n' 转换为 '\n' 而无需任何类型的 "lookup table"
n
和\n
是完全不同的字符。它们彼此之间没有任何关系。 \n
只是一个助记符。没有公式。
也许这就是您要找的东西?
目前我想不出比使用 switch-case 语句或某种键值对更好的方法来解决这个问题。
编辑:添加了示例:
#include <iostream>
char GetSpecialCharacter(char c){
switch(c){
case 'n':
return '\n';
case 'r':
return '\r';
case 't':
return '\t';
// More espace character checks here...
default:
return '[=10=]';
}
}
int main(void){
std::cout << "This is a " << GetSpecialCharacter('n') << "test.";
return 0;
}
您的实现看起来不错,使用 switch
、constexpr
and/or 宏进行模优化。
'x'
和 '\x'
之间没有任何关系,对于所有 x
。
它们之间没有固定的 ASCII 偏移量
因此,您不能比查找做得更好 table。
没有特殊的方法可以将'n'
转换成'\n'
,因为它们是完全不相关的值;您正在执行的映射中没有模式。您正在做一个简单的整数映射(在 'n'
到 '\n'
的情况下,将 0x6E 映射到 0x0A)。我会推荐一个比你现在做的更简单的实现,尤其是对于这么少的映射:
static bool getEscaped( char letter, char& escaped )
{
switch(letter)
{
case 'b':
escaped = '\b';
return true;
case 'f':
escaped = '\f';
return true;
case 'n':
escaped = '\n';
return true;
case 'r':
escaped = '\r';
return true;
case 't':
escaped = '\t';
return true;
case 'v':
escaped = '\v';
return true;
}
escaped = letter;
return false;
}
如果您绝对坚持从不需要明确指定映射,并坚持为了您的目的利用 C++ 字符转义中的关系,那么您可以编写自己的预处理器来生成我放置的 switch 语句多于。我不建议只处理 6 个案例。
本质上,您是在将 6 个整数映射到 6 个其他不相关的整数。只需使用 switch
.
我需要一个函数,它可以给我从字母字符中转义的特殊字符。它仅在有意义时适用:'t'、'n'、'r'、'b'、'f'、'v'.
现在,这是我的实现:
typedef struct SpecialCharacter
{
SpecialCharacter( char letter, char special )
{
m_letter = letter;
m_special = special;
}
char m_letter;
char m_special;
} SpecialCharacter;
typedef std::vector<SpecialCharacter> SpecialCharacters;
static const SpecialCharacters& GetSpecialCharacters()
{
static SpecialCharacters characters;
if ( characters.empty() )
{
characters.push_back( SpecialCharacter( 'b', '\b' ) );
characters.push_back( SpecialCharacter( 'f', '\f' ) );
characters.push_back( SpecialCharacter( 'n', '\n' ) );
characters.push_back( SpecialCharacter( 'r', '\r' ) );
characters.push_back( SpecialCharacter( 't', '\t' ) );
characters.push_back( SpecialCharacter( 'v', '\v' ) );
}
return characters;
}
static bool getEscaped( char letter, char& escaped )
{
for ( SpecialCharacters::const_iterator iter = GetSpecialCharacters().begin();
iter != GetSpecialCharacters().end();
++iter )
{
if ( letter == iter->m_letter)
{
escaped = iter->m_special;
return true;
}
}
return false;
}
我不喜欢向字符向量添加元素的方式:
characters.push_back( SpecialCharacter( 'b', '\b' ) );
有什么办法吗:
characters.push_back( SpecialCharacter( 'b' ) );
然后有类似的东西:
SpecialCharacter( char letter )
{
m_letter = letter;
m_special = '\' + letter; // does not work, of course!
}
我想要一种将“\”和 'n' 合并到“\n”中的方法,或者通过任何不同的方式从 'n' 中获取“\n”...
编辑:case 语句是我在将代码移动到结构向量之前最初拥有的语句(因为我需要一个函数来解决这个问题)。所以这不是解决我的问题的好方法。我想将 'n' 转换为 '\n' 而无需任何类型的 "lookup table"
n
和\n
是完全不同的字符。它们彼此之间没有任何关系。 \n
只是一个助记符。没有公式。
也许这就是您要找的东西?
目前我想不出比使用 switch-case 语句或某种键值对更好的方法来解决这个问题。
编辑:添加了示例:
#include <iostream>
char GetSpecialCharacter(char c){
switch(c){
case 'n':
return '\n';
case 'r':
return '\r';
case 't':
return '\t';
// More espace character checks here...
default:
return '[=10=]';
}
}
int main(void){
std::cout << "This is a " << GetSpecialCharacter('n') << "test.";
return 0;
}
您的实现看起来不错,使用 switch
、constexpr
and/or 宏进行模优化。
'x'
和 '\x'
之间没有任何关系,对于所有 x
。
因此,您不能比查找做得更好 table。
没有特殊的方法可以将'n'
转换成'\n'
,因为它们是完全不相关的值;您正在执行的映射中没有模式。您正在做一个简单的整数映射(在 'n'
到 '\n'
的情况下,将 0x6E 映射到 0x0A)。我会推荐一个比你现在做的更简单的实现,尤其是对于这么少的映射:
static bool getEscaped( char letter, char& escaped )
{
switch(letter)
{
case 'b':
escaped = '\b';
return true;
case 'f':
escaped = '\f';
return true;
case 'n':
escaped = '\n';
return true;
case 'r':
escaped = '\r';
return true;
case 't':
escaped = '\t';
return true;
case 'v':
escaped = '\v';
return true;
}
escaped = letter;
return false;
}
如果您绝对坚持从不需要明确指定映射,并坚持为了您的目的利用 C++ 字符转义中的关系,那么您可以编写自己的预处理器来生成我放置的 switch 语句多于。我不建议只处理 6 个案例。
本质上,您是在将 6 个整数映射到 6 个其他不相关的整数。只需使用 switch
.