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

时间:2015-02-24 10:59:17

标签: c++ special-characters

我需要一个能从字母字符中获取转义特殊字符的函数。只有在有意义的情况下它才适用:'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'

4 个答案:

答案 0 :(得分:3)

n\n是完全不同的字符。它们之间没有任何关联。 \n只是一个助记符。没有公式。

答案 1 :(得分:0)

您的实施看起来很好,使用switchconstexpr和/或宏进行模数优化。

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