-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

因为您不允许在字符串上使用空终止符。

好的,再详细一点。您还没有明确说明您要做什么,因此假设您要写入 5 个 char 字节。问题是,当您读回 5 个字符时,您会将它们读回 char 数组(很好),然后尝试打印没有空终止符的数组 - 不好。

所以要么将它们读回一个新数组并设置

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 回答