15

以下を服用してください。

char buffer[512];

memset(buffer, 0, sizeof(buffer));
sprintf(&buffer[0],"This Is The Longest String In the World that in text goes on and..");

printf("Buffer:%s\r\n",buffer);

トラブルシューティングと編集を容易にするために、この文字列を複数行で作成できるようにしたいと考えています。ただし、\コマンドを使用すると、出力がタブのように見えるもので区切られますか?

例:

sprintf(&buffer[0],"This Is The\
    Longest String In the World\
    that in text goes on and..");

次の出力が得られます。

Buffer:This Is The        Longest String In the World       that in text goes on and..

何か案は?これは、文字列を複数行のコードに分割しようとする間違ったアプローチですか?

4

3 に答える 3

23

改行の継続では、コード内の空白が考慮されます。

読みやすくするために、文字列リテラルの連結を利用できます。

sprintf(buffer, "This Is The "
                "Longest String In the World "
                "that in text goes on and..");

を使用\すると、列 0 で文字列の継続を開始する必要があります。

sprintf(buffer, "This Is The \
Longest String In the World \
that in text goes on and..");
于 2012-10-02T17:02:48.017 に答える
8

これは衒学的に思えるかもしれませんが、私は現実の世界で十分な回数噛まれており、他の2つの投稿された回答で次の問題が発生しています。

  • 投稿された2つの回答は、別々の文字列リテラルを結合する単語の間にスペースを入れることを怠っています(最初のテストの後は明らかです)。

  • 文字列が非常に長い場合は、snprintf()代わりに使用してください。少し不器用ですが、コードをレビューする人には、コードのメンテナンスにおける一般的な危険性を認識していることがわかります。

  • 文字列にが含まれている%場合は、コンパイラの警告(良好)またはランダムなセグメンテーション違反(不良)が発生します。したがって、"%s"または、おそらくこの場合は、strcpy().(2か月以内に、同僚が99.9%メッセージに簡単に追加できるようになります)を使用します。

  • memset(),私がよく目にする使用法は、単なるカーゴカルトプログラミングです。はい、特別な場合にはそれが必要ですが、それを常に使用すると間違ったメッセージが送信されます。

  • そして最後に、なぜ誰か&buffer[0]がちょうどそうするのに使うのbuffer でしょうか?

要約すると、コードはおそらく次のようになります。

char buffer[512];
snprintf(buffer, sizeof buffer, "%s", 
   "This is The Longest String "
   "In the World that in text "
   "goes on and on and on and on ....");
printf("Buffer:%s\r\n", buffer);
于 2012-10-02T17:49:46.793 に答える
4

これも同様に機能します。

char buffer[512];
sprintf(&buffer[0], "This is the longest string"
        "in the world that in text"
        "goes on and on and on and on ....");
printf("%s\n", buffer);
于 2012-10-02T17:04:19.477 に答える