使用特殊字符打印字符串变量

时间:2016-09-01 03:37:54

标签: c++ printf

当我想要字符串中的特殊字符时,我应该使用“\”:

std::string text("item \t new_item\n")

但是,如果我打印这个字符串,显然会打印出来:

item      new_item

有没有办法设置std :: cout来打印所有特殊字符:

item \t new_item \n

3 个答案:

答案 0 :(得分:4)

没有内置方法可以做到这一点。您需要手动转义字符。例如,在C中,它类似于:

for (const char* p = text; *p != '\0'; ++p)
{
    int c = (unsigned char) *p;

    switch (c)
    {
        case '\\':
            printf("\\\\");
            break;
        case '\n':
            printf("\\n");
            break;
        case '\r':
            printf("\\r");
            break;
        case '\t':
            printf("\\t");
            break;

        // TODO: Add other C character escapes here.  See:
        // <https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences>

        default:
            if (isprint(c))
            {
                putchar(c);
            }
            else
            {
                printf("\\x%X", c);
            }
            break;
    }
}

(注意我写了上面的答案,而问题仍然用C标记,我使用printf,因为我发现它比通过C ++更简单(特别是出于演示目的)&#39 ; s iostream格式化机制。)

答案 1 :(得分:2)

\t\n将分别打印一个标签(4个空格)和一个新行。

如果您想打印\t\n作为输出。您必须在\\t之前添加额外的\n作为前缀。

std::string text("item \\t new_item \\n")

答案 2 :(得分:1)

C ++标准库没有直接支持转义字符串。

您可以直接实现它,但这会遇到三个问题:

  • 对于ASCII的转义字符(代码27),存在非标准转义符,例如\e,例如,克++

  • 每个charCHAR_BIT的{​​{1}})的位数,以及数字转义中必需的位数,取决于系统。

  • 字符是否可打印,即是否需要转义,取决于区域设置。当前区域设置的竞争指标的数量进一步复杂化:C级全局区域设置,C ++级别全局区域设置,或者例如<limits.h>中充满了语言环境?

有了一些硬连线选择,实现代码可能如下所示:

cout