【问题标题】:How to print '\n' instead of a newline?如何打印 '\n' 而不是换行符?
【发布时间】:2024-01-11 20:23:02
【问题描述】:

我正在编写一个程序,它使用打印其输入的十六进制转储。但是,当传入换行符、制表符等并破坏我的输出格式时,我遇到了问题。

如何使用 printf(或我猜是 cout)打印 '\n' 而不是打印实际的换行符?我只需要为此做一些手动解析吗?

编辑:我正在动态接收我的数据,这不仅仅是我讨厌的 \n,而是所有符号。例如,这是我的 printf 语句:

printf("%c", theChar);

当换行符作为 theChar 传入时,如何打印 \n 但当 theChar 是有效的可打印字符时,它仍然打印普通文本?

【问题讨论】:

  • 请记住,对 printf("%c", foo) 的单个调用不可能输出 \n,即两个字符的字符串。您基本上必须在更改输入(将“\n”替换为“\\n”)或老式的 if (theChar == '\n') 之间做出选择。

标签: c++ formatting printf cout


【解决方案1】:

打印“\\n”——“\\”产生“\”,然后“n”被识别为普通符号。如需更多信息,请参阅here

【讨论】:

    【解决方案2】:

    下面的函数printchar() 会将一些字符打印为“特殊”,并为超出范围的字符打印八进制代码(如 Emacs),否则打印普通字符。我还冒昧地让'\n' 在它之后打印一个真正的'\n',以使您的输出更具可读性。另请注意,我在main 的循环中使用int 只是为了能够遍历unsigned char 的整个范围。在您的使用中,您可能只有一个从数据集中读取的 unsigned char

    #include <stdio.h>
    
    static void printchar(unsigned char theChar) {
    
        switch (theChar) {
    
            case '\n':
                printf("\\n\n");
                break;
            case '\r':
                printf("\\r");
                break;
            case '\t':
                printf("\\t");
                break;
            default:
                if ((theChar < 0x20) || (theChar > 0x7f)) {
                    printf("\\%03o", (unsigned char)theChar);
                } else {
                    printf("%c", theChar);
                }
            break;
       }
    }
    
    int main(int argc, char** argv) {
    
        int theChar;
    
        (void)argc;
        (void)argv;
    
        for (theChar = 0x00; theChar <= 0xff; theChar++) {
            printchar((unsigned char)theChar);
        }
        printf("\n");
    }
    

    【讨论】:

    • 应该是 = 127。此外,对于 %o,您需要将 theChar 转换为 unsigned char(或 & 0xff),因为 char 通常是有符号的。
    • 谢谢@mark4o,你对 0x20 和 32 是正确的。修正了我的答案。
    • 上限的条件应该是 >= 0x7f 而不是 > 0x7f。 0x7f 字符表示删除不可打印字符
    【解决方案3】:

    只需使用“\\n”(两个斜杠)

    【讨论】:

      【解决方案4】:

      您可以转义反斜杠以使其仅打印正常的反斜杠:"\\n".

      编辑:是的,您必须进行一些手动解析。然而,这样做的代码只是搜索和替换。

      【讨论】:

        【解决方案5】:

        如果您想确保不打印任何不可打印的字符,那么您可以使用ctype.h 中的函数,例如isprint

        if( isprint( theChar ) )
          printf( "%c", theChar )
        else
          switch( theChar )
          {
          case '\n':
             printf( "\\n" );
             break;
          ... repeat for other interesting control characters ...
          default:
             printf( "\\0%hho", theChar ); // print octal representation of character.
             break;
          }
        

        【讨论】:

          【解决方案6】:
          printf("\\n");
          

          【讨论】:

            【解决方案7】:

            除了别人提供的例子,你应该看看像isprint()iscntrl()这样的字符分类函数。这些可用于检测哪些字符可打印或不可打印,而无需从 ascii 表中硬编码十六进制值。

            【讨论】:

              【解决方案8】:

              在 C/C++ 中,'\' 字符被保留为转义字符。所以当你想实际打印一个'\'时,你必须输入'\'。因此,要打印实际的 '\n' 值,您将打印以下内容:

              printf("\\n");
              

              【讨论】:

                【解决方案9】:

                在调用 printf 之前,只需使用 String::replace 替换有问题的字符。

                你可以包装 printf 来做这样的事情:

                void printfNeat(char* str)
                {
                    string tidyString(str);
                    tidyString.replace("\n", "\\n");
                    printf(tidyString);
                }
                

                ...只需添加额外的替换语句即可摆脱其他不需要的字符。

                [编辑],或者如果你想使用参数,试试这个:

                void printfNeat(char* str, ...)
                {
                    va_list argList;
                    va_start(argList, msg);
                
                    string tidyString(str);
                    tidyString.replace("\n", "\\n");
                    vprintf(tidyString, argList);
                
                    va_end(argList);
                }
                

                【讨论】:

                • 这不是 std::basic_string::replace 的工作方式。从en.cppreference.com/w/cpp/string/basic_string/replace 我们看到用新字符串替换will replace the part of the string indicated by either [pos, pos + count) or [first, last)。它不搜索原始字符串并替换找到的匹配项。
                【解决方案10】:

                从 C++11 开始,您还可以使用原始字符串

                std::printf(R"(\n)");
                

                R"()" 中的所有内容都将按字面意思打印。转义序列将不会被处理。

                【讨论】:

                  【解决方案11】:

                  这个问题有三种解决方案:

                  解决方案 1: 每个符号、数字、字母都有自己的 ASCII 值。 '\' 的 ASCII 值为 92,'n' 为 110。立即值(数字 (ASCII))存储在两个整数变量中。打印时,使用格式说明符 %c(字符)。

                  void main() { 
                      int i=92, j=110; 
                      clrscr(); 
                      printf("%c%c", i, j);
                      getch();
                  }
                  

                  在您的 C 编程软件中尝试一下...

                  解决方案 2:

                  程序有效。但我觉得这不公平... 在输出屏幕上,输入 \n... 你会得到另一个\n..

                  void main() {
                    char a[10];
                    gets(a);
                    printf("\n\n\n\n");
                    puts(a);
                    getch(); 
                  }
                  

                  试用程序

                  解决方案 3: 上面已经说过使用\n

                  【讨论】:

                    最近更新 更多