7

入力の 16 進ダンプを出力するプログラムを作成しています。ただし、改行、タブなどが渡されて出力フォーマットが破壊されると、問題が発生します。

実際の改行を印刷する代わりに、printf (または私が推測する cout) を使用して '\n' を印刷するにはどうすればよいですか? これを手動で解析する必要がありますか?

編集:私はデータを動的に受け取っています.\nだけではなく、すべてのシンボルです. たとえば、これは私の printf ステートメントです。

printf("%c", theChar);

改行が theChar として渡されたときに \n を出力するようにするにはどうすればよいですか? ただし、theChar が有効な印刷可能文字である場合に通常のテキストを印刷するにはどうすればよいですか?

4

11 に答える 11

40

Print "\\n" – "\\" は "\" を生成し、"n" は通常の記号として認識されます。詳細については、こちらを参照してください。

于 2009-07-03T15:04:23.057 に答える
23

以下の関数printchar()は、一部の文字を「特殊」として出力し、範囲外の文字 (Emacs 風) の 8 進コードを出力しますが、それ以外の場合は通常の文字を出力します。また、出力を読みやすくするために、その後に'\n'実数を印刷する自由を取りました。また、 の範囲全体を反復処理できるようにするために、ループ内で'\n'を使用していることにも注意してください。あなたの使用法では、データセットから読み取るだけの可能性があります。intmainunsigned charunsigned 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」(2 つのスラッシュ)を使用するだけです

于 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

C/C++ では、'\' 文字はエスケープ文字として予約されています。そのため、'\' を実際に印刷したいときはいつでも、'\' を入力する必要があります。したがって、実際の '\n' 値を出力するには、次のように出力します。

printf("\\n");
于 2009-07-04T05:44:35.577 に答える
3

他の人が提供した例に加えて、isprint()iscntrl( ) などの文字分類関数を確認する必要があります。これらを使用して、ASCII テーブルから 16 進値をハードコードすることなく、印刷可能な文字と印刷できない文字を検出できます。

于 2009-07-03T22:29:06.717 に答える
1

printf を呼び出す前に、String::replaceを使用して問題のある文字を置き換えてください。

printf をラップして、次のようにすることができます。

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

...そして、余分な replace ステートメントを追加して、他の不要な文字を取り除くだけです。

[編集]または引数を使用する場合は、これを試してください:

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 に答える
-2

この質問には3つの解決策があります。

解決策1:すべての記号、数字、アルファベットには独自のASCII値があります。'\'のASCII値は92、'n'は110です。即値(数値(ASCII))は2つの整数変数に格納されます。印刷中は、フォーマット指定子%c(文字)が使用されます。

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

Cプログラミングソフトウェアで試してみてください...

解決策2:解決策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 に答える