如何打印'\ n'而不是换行?

时间:2009-07-03 15:02:22

标签: c++ formatting printf cout

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

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

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

printf("%c", theChar);

当换行符作为theChar传入时,如何进行此打印\ n但是当theChar是有效的可打印字符时仍然使其打印正常文本?

11 个答案:

答案 0 :(得分:37)

打印“\\ n” - “\\”生成“\”,然后“n”被识别为普通符号。有关详细信息,请参阅here

答案 1 :(得分:22)

下面的函数printchar()会将某些字符打印为“特殊”,并打印超出范围的字符的八进制代码(a la Emacs),否则打印普通字符。我还冒昧地让'\n'打印出真实的'\n',以使您的输出更具可读性。另请注意,我在int的循环中使用main只是为了能够遍历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");
}

答案 2 :(得分:8)

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

答案 3 :(得分:6)

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

编辑:是的,你必须做一些手动解析。但是,这样做的代码只是一个搜索和替换。

答案 4 :(得分: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;
  }

答案 5 :(得分:4)

printf("\\n");

答案 6 :(得分:3)

除了其他人提供的示例之外,您还应该查看isprint()iscntrl()等字符分类函数。这些可用于检测哪些字符是可打印的或不可打印的,而无需对ascii表中的十六进制值进行硬编码。

答案 7 :(得分:3)

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

printf("\\n");

答案 8 :(得分:1)

在调用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);
}

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:-2)

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

解决方案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