1

strncpy()余分な文字を必要な長さでコピーするのに問題があります。最上位 10 ビットをある文字列から別の文字列にコピーする必要があります (両方ともchar*形式で)。

大きい変数のサイズは直感的には問題ではなく、小さい変数は、必要な値よりも大幅に小さい場合にのみ出力に影響します (これがなぜなのかはわかりません)。

my の n 値がstrncpy()問題の原因かもしれませんが、なぜこのように動作しているのかわかりません。私が間違っていなければ、宛先文字列の長さ n は、末尾の null 文字を考慮して、データよりも 1 長くする必要があります。

私の文字列はこのようにまったく動作していません。に設定nすると11、次の出力が表示されます。

00000111101100100100001110100000

00000111101

10文字しかコピーせず、最後の文字はnullになると思います。増やしnても同じ結果になります。

n を 10 に減らすと、問題の核心が明らかになります。

00000111101100100100001110100000

0000011110@

なぜこれを行うのかはわかりませんが、 n が減少するにつれて、nがはるかに小さくなるまで (約 8)、これを実行し続けます。

これらは私のコードの関連行です:

char line[11], hexAddr[8], binAddr[33], lv1Index[11];
    ...
strncpy(lv1Index, binAddr, 10);

この前はそのままでlv1Index、 binAddr は直接 (指定された出力に) 表示されます。

追加された文字は常になので、初期化前@のゴミではないと思います。lv1Index

4

1 に答える 1

3

1 つの C++ リファレンスから:

num 文字がコピーされる前にソース C 文字列 (null 文字によって通知される) の末尾が見つかった場合、合計 num 文字が書き込まれるまで、destination にゼロが埋め込まれます。

ヌル文字は宛先の末尾に暗黙的に追加されないため、ソースの C 文字列の長さが num 未満の場合にのみ宛先がヌルで終了します。

他のドキュメント ( MSDNman ページ) にも同様の情報があります。

これは、ヌル ターミネータを自分自身に配置する必要があることを意味します。

 lv1Index[10] = '\0';
于 2011-11-21T05:56:51.500 に答える