7

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

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

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

printf("%c", theChar);

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

4

11 回答 11

40

打印“\\n”——“\\”产生“\”,然后“n”被识别为普通符号。有关更多信息,请参见此处

于 2009-07-03T15:04:23.057 回答
23

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

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

于 2009-07-03T15:04:30.713 回答
6

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

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

于 2009-07-03T15:04:10.747 回答
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;
  }
于 2009-07-03T17:22:54.263 回答
4
printf("\\n");
于 2009-07-03T15:06:33.283 回答
3

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

于 2009-07-03T22:29:06.717 回答
3

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

printf("\\n");
于 2009-07-04T05:44:35.577 回答
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);
}
于 2009-07-03T15:08:51.080 回答
1

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

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

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

于 2014-07-11T00:46:17.080 回答
-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

于 2012-06-03T03:28:45.047 回答