2

私は perl プログラマーですが、c 言語には次のような段落を保存する便利な方法がないことに驚きました。

       my $a = <<'dd';
          hello wolrd..
           1
            2
             3
       dd 

では、C でスミリアリ操作を行うにはどうすればよいでしょうか。

4

3 に答える 3

5

同じ機能の多くを提供する2つの異なる答えがあなたの質問にあります。

両方

char *str="Line 1\nLine 2\nLine 3";

char str[]="Line 1\nLine 2\nLine 3";

段落をそのように印刷できるようにします。

printf("%s",str);

ただし、最初の宣言(char *str)は、通常は読み取り専用メモリに文字列を作成しますが、2番目の宣言では、実行時に文字列を編集できます。この描写は重要ですが、常に明確であるとは限りません。詳細については、この質問を参照してください。

文字\nは改行文字であり、ターゲットプラットフォームで期待どおりに動作することを確認する必要があります。たとえば、DOSでは、 `" \ r \ n "を使用する必要がある場合があります。これは、キャリッジリターン+ラインフィードです。Wikiにはこれに関する記事があります。

あるコメント提供者が指摘したように、これらの形式のもう1つの違いは*str、ポインターとして機能するのに対し、str[]機能しないことです。常にではありませんが、多くの場合、同じ動作をします。この質問には、これに関する詳細情報があります。

一部のコメント提供者が指摘しているように、一部のコンパイラでは文字列リテラルの長さに制限があります。一部のアカウントでは、MSVCには2048文字の制限がありますが(ここを参照)、GCCには制限がありません。C90では、少なくとも509個の1バイト文字の長さが保証されています。これはC99では4095に増加しました。

とにかく、この長さの制限を回避したい場合、またはテキストをよりきれいに整理したい場合は、この形式を使用できます(改行と引用符は明示的に使用する必要があり、コンパイラは隣接する文字列を連結として扱います)。

char *str =
  "Line 1\n"
  "Line 2\n"
  "Line 3\n";

またはこれ(行末のバックスラッシュは、フォーマット用に挿入した改行をエスケープします。ここでコードをインデントすると、文字列の一部になります):

char *str =
"Line 1 \
Line 2 \
Line 3";
于 2012-10-15T07:59:58.650 に答える
5

それは次のように行われます:

char a[] = 
    "hello world\n"
    " 1\n"
    "  2\n"
    "   3\n";
于 2012-10-15T07:52:48.883 に答える
1

あなたは試すことができます

char *str = "hello world\n 1\n  2\n   3\n";
于 2012-10-15T07:56:06.403 に答える