2011-11-17 17 views
15

私はシリアルポート経由で受け取るバッファを持っています。私があるcaracterを受け取ったら、フルラインが到着したことを知り、printfメソッドで印刷したいと思います。しかし、それぞれの行は、異なる長さの値を持っており、私はちょうどに行くとき:Printf長さがCの長さを渡すcharのバッファ

printf("%s", buffer); 

(それは長く、現在の1以上だった場合)私はかつてのラインに属するラインプラス追加の文字を印刷しています。

私は%sを読んでどのくらいの文字を読んでいるかを少なくともC++で知ることができますが、例はなく、Cでそれを行う方法はわかりません。 ?

EDIT:パーフェクト。だから私は3つの解決策があります を - forループ でcharで文字を印刷する - 終了文字 を使用して - または使用*

質問です:どちらが速いのですか?私はマイクロチップのPICで作業しているので、できるだけ速く処理したいと思っています。

+2

。これは '' sprintf() 'に印刷文字の停止を指示します。 –

答えて

22

あなたが持っている文字列はNULLで終了していないので、printf(と他のC文字列関数)それはそこにあるヌル文字に遭遇するまで、そこにある文字を書き続けるでしょう。そう、fwriteが印刷だけで文字列を考えていないので、これは動作します

fwrite(buffer, buffer_length, 1, stdout); 

が、あらゆる種類のデータ:stdout

  • 使用fwrite

    あなたがいずれかのことができ、あなたの問題を解決するために、終端のヌル文字は探しませんが、書き込むデータの長さをパラメータとして受け取ります。

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

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

    あなたがbufferの上に他の文字列処理を行う必要がある場合、これは今で終了ヌルとすることによってその扱いされることを、より良いアイデアかもしれません通常のC文字列処理関数。

+0

私はこのSOの質問の重複に対する回答はこの方法を含まないが、単にforのループを示唆して驚いている... – Alex

1

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

+0

downvotedを持っている人はなぜ私は私の答えを改善することができる理由を説明したいですか? –

+0

OPを修正する方法に加えて、OPが何を間違っていたかを述べるべきです。 – Alex

37

あなたは終了文字の後にNULL文字を追加するか、そしてあなたのprintfが動作する、またはあなたのprintf文で'.*'を追加することができますし、++長さにあなたをCで

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

を提供しますおそらく、このように、代わりのstd ::文字列とstd :: coutのを使用します。

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

あなたが望むすべてが最速のスピードと書式なしの場合 - その後、

fwrite(buf,1,len,stdout); 
+0

いいえ、これを知らなかった – Ben

+0

パーフェクト。だから、私は3つの解決策を持っています:forループを使ったcharによるcharの出力、終了文字の使用、または使用。* QUESTION IS:どちらが高速ですか?私はマイクロチップのPICで作業しているので、速く起こってほしいと思っています。 –

+0

@RomanRdgz:私の推測: 'fwrite'またはヌル終端+' fputs'が最も早く、ヌル終了+ printf'なぜなら、コンパイラが非常にスマートなのでなければ、フォーマット文字列を解析しなければならないかもしれないからです)、 '。*'(おそらくフォーマット文字列を解析する必要があります)と 'print *しかし、インライン化することができます)。 –

3

を使用しますが、最後の文字を受け取った後、バッファにNUL(0x0の)を置くことができます。あなたは*「特定の文字」*とbuffer` `にそれを追加しているが、同様にヌル文字( '\ 0'を)追加することを受け取った

buffer[i] = 0;

関連する問題