web-dev-qa-db-ja.com

Cの長さを持つcharのバッファーをprintf

シリアルポートを介して受信するバッファがあります。特定の文字を受け取ったとき、完全な行が到着したことがわかり、printfメソッドを使用してその文字を印刷したいと思います。しかし、各行には異なる長さの値があり、私がちょうど行くとき:

printf("%s", buffer);

行と前の行に属する追加の文字を印刷しています(現在の行よりも長い場合)。

私は here を読みますが、少なくともC++では、%sを指定すると、読み取りたい文字数を知ることができますが、例がなく、方法がわかりませんCでそれを行う。

私は3つの解決策があると思います:

  • forループを使用して文字ごとに出力する
  • 終了文字を使用する
  • または。*を使用

質問IS:どちらが速いですか?私はマイクロチップPICに取り組んでいて、それをできるだけ早く実行したいので

18
Roman Rdgz

あなたが持っている文字列はnullで終了していないので、printf(およびその他のC文字列関数)はその長さを決定できません。たまたまそこにいる。

問題を解決するには、次のいずれかを実行できます。

  • fwriteよりもstdoutを使用:

    fwrite(buffer, buffer_length, 1, stdout);
    

    これが機能するのは、fwriteが文字列だけでなくあらゆる種類のデータを出力することを想定していないため、終端のnull文字を検索せず、パラメーターとして書き込むデータの長さを受け入れるためです。

  • 印刷する前にバッファを手動でnullで終了します。

    buffer[buffer_length]=0;
    printf("%s", buffer); /* or, slightly more efficient: fputs(buffer, stdout); */
    

    これは、bufferに対して他の文字列処理を実行する必要がある場合に、より良いアイデアになる可能性があります。これは、nullで終了し、通常のC文字列処理関数で管理できるようになります。

27
Matteo Italia

終了文字の後にヌル文字を追加すると、printfが機能するか、printfステートメントに'.*'を追加して長さを指定できます

printf("%.*s",len,buf);

C++では、おそらく次のように、代わりにstd :: stringとstd :: coutを使用します。

std::cout << std::string(buf,len);

必要なのは最速でフォーマットは不要な場合-

fwrite(buf,1,len,stdout);
42
Soren

最後の文字を受け取った後、NUL(0x0)をバッファに入れることができます。

buffer[i] = 0;

3
Gowtham

行の終わりを特定したら、printfに送信する前に、'\0'文字をバッファーの終わりに追加する必要があります。

2
Michael Price