如何将字母字符转换为相应的转义特殊字符

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;
}

您的实现看起来不错,使用 switchconstexpr 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.