4

私は最も奇妙なことが起こっていますが、なぜそれが起こっているのかよくわかりません。基本的に私がする必要があるのは、fgetcを使用して単純なASCIIファイルの内容をバイトごとに取得することです。奇妙な部分はそれが機能したことですが、それから私はさらにいくつかの文字を追加しました、そして突然それはそこになかった改行を追加し、ファイルの終わりか何かの終わりを超えて読みました。文字通り私がしたのは

do {
    temp = (char*) checked_realloc (temp, n+1);
    e = fgetc(get_next_byte_argument);
    temp[n] = e;
    if (e != EOF)
      n++;
 }
while (e != EOF);

そして、確認するために、各文字を印刷しました

temp_size = strlen(temp)-1;
for(debug_k = 0; debug_k < temp_size; debug_k++){
  printf("%c", temp[debug_k]);
}

また、ファイルに含まれていなかった改行を追加したことを除いて、すべてが正しく出力されます。その前に、私は持っていました

temp_size = strlen(temp);

しかし、それはいくつかの未知のバイト(それはぎこちないものを印刷した)で終わった。念のためstrlen(temp)-2を試してみましたが、その特定のファイルで機能しましたが、最後に「a」を追加すると、再び壊れました。

私は正直に困惑しています。なぜこれをしているのか分かりません。

編集:checked_reallocは単なるreallocですが、メモリが不足していないことを確認するための簡単なチェックがあります。これがこれを行うための最も効率的な方法ではないことは理解していますが、なぜ私が魔法のように余分なバイトを読み取っているように見えるのかについてもっと心配しています。

4

2 に答える 2

1

このような操作を記述するより安全な方法は次のとおりです。

  1. 再割り当ての前にメモリを割り当てている場合は、使用前にメモリバルクをゼロで設定します。再割り当てするたびに、ゼロに初期化します。
  2. メモリを使用して文字列にアクセスしたり、そのメモリで文字列関数を使用したりする場合は、常にそのメモリをNULLバイトで終了していることを確認してください。

do{
    temp = (char*) checked_realloc (temp, n+1);//I guess you are starting n with 0? 
    temp[n]=0;
    e = fgetc(get_next_byte_argument);
    temp[n] = e;
    if (e != EOF)
        n++;
} while (e != EOF);
temp[n]=0;
n=0;

上記のコードを変更すると、問題が解決するはずです。strlen -1 はもう必要ありません。:)

乾杯。

于 2013-01-18T07:42:49.663 に答える
0

文字列を null で終了するのを忘れたようです。temp[n] = 0;の直後に追加しwhileます。

于 2013-01-18T07:31:27.767 に答える