シリアルポートを介して受信するバッファがあります。特定の文字を受け取ったとき、完全な行が到着したことがわかり、printf
メソッドを使用してその文字を印刷したいと思います。しかし、各行には異なる長さの値があり、私がちょうど行くとき:
printf("%s", buffer);
行と前の行に属する追加の文字を印刷しています(現在の行よりも長い場合)。
私は here を読みますが、少なくともC++では、%s
を指定すると、読み取りたい文字数を知ることができますが、例がなく、方法がわかりませんCでそれを行う。
私は3つの解決策があると思います:
for
ループを使用して文字ごとに出力する質問IS:どちらが速いですか?私はマイクロチップPICに取り組んでいて、それをできるだけ早く実行したいので
あなたが持っている文字列は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文字列処理関数で管理できるようになります。
終了文字の後にヌル文字を追加すると、printfが機能するか、printfステートメントに'.*'
を追加して長さを指定できます
printf("%.*s",len,buf);
C++では、おそらく次のように、代わりにstd :: stringとstd :: coutを使用します。
std::cout << std::string(buf,len);
必要なのは最速でフォーマットは不要な場合-
fwrite(buf,1,len,stdout);
最後の文字を受け取った後、NUL(0x0)をバッファに入れることができます。
buffer[i] = 0;
行の終わりを特定したら、printf
に送信する前に、'\0'
文字をバッファーの終わりに追加する必要があります。