我需要一个能从字母字符中获取转义特殊字符的函数。只有在有意义的情况下它才适用:'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语句是我之前将代码移动到struct的向量之前的原因(因为我需要一个函数来解决这个问题)。所以这对我的问题不是一个好的解决方案。我想在没有任何“查找表”的情况下将'n'转换为'\ n'
答案 0 :(得分:3)
n
和\n
是完全不同的字符。它们之间没有任何关联。 \n
只是一个助记符。没有公式。
答案 1 :(得分:0)
您的实施看起来很好,使用switch
,constexpr
和/或宏进行模数优化。
'x'
和'\x'
之间没有关系,所有x
之间没有固定的ASCII偏移。
所以,你不能比查找表做得更好。
答案 2 :(得分:0)
没有特殊方法可以将'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
。
答案 3 :(得分:-2)
也许这就是你要找的东西?
https://stackoverflow.com/a/5612287/4405589
我无法想出解决此问题的更好方法,而不是使用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 '\0';
}
}
int main(void){
std::cout << "This is a " << GetSpecialCharacter('n') << "test.";
return 0;
}