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

问题描述:

我正在写一个程序,使用它的输入打印一个十六进制转储。然而,当新行,制表符等被传入并破坏我的输出格式时,我遇到了问题。如何打印' n'而不是换行符?

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

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

printf("%c", theChar); 

我怎样才能让这个打印\ n当一个换行符传递作为theChar但仍使其打印普通文本时theChar是一个有效的可打印字符?

+1

请记住,对printf(“%c”,foo)的单个调用无法输出\ n,这是一个由两个字符组成的字符串。你基本上必须在改变输入(用“\\ n”替换“\ n”)或老式if(theChar =='\ n')之间进行选择。 – ojrac 2009-07-03 15:25:06

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

可以逃避反斜杠,使其打印只是一个普通的反斜杠:"\\n".

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

只要使用 “\\ N”(双斜杠)

printf("\\n"); 

只需使用String::replace你调用printf之前更换有问题的字符。

你可以换行的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); 
} 
+0

这不是std :: basic_string :: replace的工作原理。从http://en.cppreference.com/w/cpp/string/basic_string/replace中我们可以看到替换`将替换[pos,pos + count)或[first,last)'中指定的字符串部分一个新的字符串。它不搜索原始字符串并替换找到的事件。 – Jon 2016-01-28 00:44:16

了以下功能printchar()将打印一些字符为“特殊”,并打印字符的八进制代码超出范围(a la 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"); 
} 
+2

+1:好主意 127 catch – 2009-07-03 15:20:06

如果你想确保你没有打印任何非打印字符,那么您可以在使用功能ctype.hisprint

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

除了所提供的实例其他人,你应该看看字符分类功能,如isprint()iscntrl()。这些可用于检测哪些字符是否可打印,而不必从ASCII表中硬编码十六进制值。

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

printf("\\n"); 

有此问题的三种解决方案:

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

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已经说过

由于C++ 11,你也可以使用原始字符串

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

一切内0123字面上打印和)"。转义序列不会被处理。