-1

次のコードを実行すると、HALLO 文字列の横に余分なガベージが表示されるのはなぜですか?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *binfile;

    binfile = fopen("binary.bin", "wb+");

    char arr[5] = "HALLO";
    int integer = 1;
    double doub = 1.2345;

    fwrite(arr, sizeof(arr), 1, binfile);
    fwrite(&integer, sizeof(int), 1, binfile);
    fwrite(&doub, sizeof(double), 1, binfile);

    fclose(binfile);

    binfile = fopen("binary.bin", "r");

    char arr2[5];
    int integer2;
    double doub2;

    fread(arr2, sizeof(arr2), 1, binfile);
    fread(&integer2, sizeof(int), 1, binfile);
    fread(&doub2, sizeof(double), 1, binfile);

    printf("%s\n", arr2);
    printf("%d\n", integer2);
    printf("%lf\n", doub2);

    fclose(binfile);
    return EXIT_SUCCESS;
}
4

2 に答える 2

2

文字列に null ターミネータを許可していないためです。

わかりました、もう少し詳しく。何をしようとしているのかを明確にしていないので、5 文字のバイトを書きたいと仮定しましょう。問題は、5文字を読み返すときに、それらをchar配列に読み戻してから(問題ありません)、その配列をnullターミネータなしで印刷しようとすることです-うまくいきません。

したがって、それらを新しい配列に読み込んで設定します

newarray[5]=0;

または、5文字あることを知って安全に印刷してください

printf("%5.5s",array);

(とにかくそのようなもの)

于 2013-10-17T23:52:30.273 に答える
1

printf("%s\n", arr2)は、arr2を char 配列としてではなく、文字列へのポインターとして解釈します。char 配列はゼロ ターミネータで終わっていないため、printfは char 配列に続くメモリ位置に格納されているものを喜んで出力します。

このコード スニペットは機能するはずです。

char arr2[5+1];
fread(arr2, sizeof(arr2) - 1, 1, binfile);
arr2[sizeof(arr2) - 1] = '\0';
printf("%s\n", arr2);
于 2013-10-18T00:04:37.370 に答える