2

ここで少し問題がありますmemcpy()

これを書くと

char ipA[15], ipB[15];
size_t b = 15;
memcpy(ipA,line+15,b);

b15番目の要素から始まる配列からバイトをコピーしますline(これは私が欲しいものです)

memcpy(ipB,line+31,b);

bこれは、31 番目の要素から始まる行からバイトをコピーします、前のコマンドの結果、つまりipA.

なんで?ipBサイズは 15 であるため、他のものをコピーするのに十分なスペースはありません。ここで何が起こっているのですか?

  • の結果ipA192.168.123.123
  • ipBの結果205.123.123.122 192.168.123.123

どこが間違っていますか?私は実際にCのメモリ割り当てについてあまり知りません。

4

3 に答える 3

6

ipA で文字列を null で終了していないようです。コンパイラは 2 つの変数をメモリ内で並べて配置したため、文字列操作では、最初の null ターミネータが 2 番目の配列の後であると想定します (0メモリ内で次に発生するときはいつでも)。

試す:

char ipA[16], ipB[16];
size_t b = 15;
memcpy(ipA,line+15,b);
ipA[15] = '\0';
memcpy(ipB,line+31,b);
ipB[15] = '\0';
printf("ipA: %s\nipB: %s\n", ipA, ipB)

これは、これが問題であるかどうかを確認する必要があります。明らかに、上記のテスト コードよりもコードをもう少しエレガントにすることができます。手動で終了する代わりに、printf("%.*s\n", b, ipA);または類似のものを使用して、printf に正しい文字数を出力させることができます。

于 2011-02-14T09:29:37.230 に答える
2

配列の内容を確認していprintf("%s", ipA)ますか?その場合、配列はnullで終了しないC文字列として解釈されるため、説明した効果が得られます。代わりにこれを行ってください:printf("%.*s", sizeof(ipA), ipA)

于 2011-02-14T09:30:18.507 に答える
0

Cの文字列には、終了マークが必要です。これはchar値0です。

2つの文字列はメモリ内で連続しているため、最初の文字列を終了しない場合は、それを読み取るときに、メモリに文字列の終わりの文字が含まれるまで続行します。

于 2011-02-14T09:30:18.590 に答える