打印字符串变量及其特殊字符

rph*_*rph 2 c++ printf

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

std::string text("item \t new_item\n")
Run Code Online (Sandbox Code Playgroud)

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

item      new_item
Run Code Online (Sandbox Code Playgroud)

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

item \t new_item \n
Run Code Online (Sandbox Code Playgroud)

Shr*_*n40 6

\t\n分别打印一个制表符(4 个空格)和一个新行。

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

std::string text("item \\t new_item \\n")
Run Code Online (Sandbox Code Playgroud)


jam*_*lin 5

没有内置的方法可以做到这一点。您将需要手动转义字符。例如,在 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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