2015-11-11 8 views
5

私は、変更されたlinuxのカスタムバージョン(そのハンドスキャナ)を実行する組み込みシステムのドライバを作成しています。製造元は、少数のライブラリとサンプルをインバウンドにしたカスタムEclipse Junoディストリビューションを提供しています。文字配列の最後の前に 0を使用する安全性

私がcomportから受け取った出力は、標準文字配列の形になります。私はこのような(エラーIDおよびエラー・コード)情報を伝えるために、アレイ内の個々の文字を使用しています:

tmpは最初 0に初期化し、その後で満たされている文字 tmp[500];の形式の文字列である
if (tmp[i] == 250]) 

comportからの入力。

私の質問です:私は、配列のすべての部分を反復処理と仮定すると、

、アレイの終了前の任意の時点で(\0のように)0を使用することが安全ですか?仮定すると、私は:

  1. は真ん中の文字列(を反復してint配列のようにそれを使用して)でそこに何が起こっているかの知識で
  2. とまさにこのランダム\ 0をとして、それを処理していませんそれは意味するはずです。

私はいくつかの同僚に、状況のいかんにかかわらず、最後までに\0を含む文字配列を使用するべきではないことを伝えてくれたからです。

私のコードは現在、期待どおりに動作しますが、後で問題が発生するかどうかはわかりません。

この動作を回避するために書き直すことは、ほんのわずかな作業です。

+1

文字列関数( 'strcpy'、' strcat'など)は決して問題ではないと思います。 –

+1

あなたの主な問題は 'tmp [i] == 250 'である。 tmpがcharの場合は、符号付きか符号なしかは不定です。それが署名されていれば、その文は-128と127の間でなければならないので真ではありません –

+0

@TomTannerそれはcharが常に符号なしであることを示しています。 – Magisch

答えて

7

charの配列を小さな整数の配列として使用すると、完全に問題ありません。 "文字列"を期待する関数に渡さないように注意してください。

さらに明示し、配列がunsigned charを使用していることを確認したい場合は、代わりにuint8_tを使用できます。

+0

私は配列が何であるかは決めていません。私はデータを取得するために使用するメーカー関数によってchar配列であると予想されます。私は確信していないか、それを他のタイプに変換することはそれを害するでしょう。 – Magisch

+0

@Magisch制限(文字列関数なし)を認識し、今後のコードの読者/ユーザのために文書化している限り、それを 'char'配列として保持することは何の害もありません。 –

+0

それでは。あなたの主張をありがとう。 (私の同僚は通常、指導の手段としてSOに従うので、これをリンクすると助けになります) – Magisch

関連する問題