从.au文件中读取Magic Number

时间:2015-04-06 18:19:27

标签: c file-io magic-numbers

我写了一个小程序来从.au文件中获取幻数并将其打印到控制台,但每次尝试时,我都会得到.snd,而不是获得预期的.snd$

我不确定为什么会发生这种情况,因为我只读了4个字节,这就是幻数的组成部分。那么,额外的角色来自哪里?

#include <stdio.H>

int main()
{
    FILE *fin;
    int r;
    char m[4], path[20];

    scanf("%s", path);
    fin = fopen(path, "r");
    r = fread(&m, sizeof(char), 4, fin);
    printf("magic number is %s\n", m);

    return 0;
}

Output

2 个答案:

答案 0 :(得分:2)

你打印它就好像它是一个字符串,在C中,意味着它已经被NUL终止了。像这样更改您的代码,它将按预期工作:

char m[5];
m[4] = '\0';  /* add terminating NUL */

另外,您应该知道scanf is a dangerous function。请改用命令行参数。

答案 1 :(得分:1)

问题不在于你的阅读方式。 问题是你的变量只有4个字符长度,并且它需要一个空字符来表示结束。

带有%s的printf将打印变量的内容,直到达到空字符,直到它可以在您的变量未正确结束时打印垃圾。 要修复你可以有一个更大的变量并将[4]字符设置为null。

新代码的外观如下:

#include <stdio.H>

int main()
{
    FILE *fin;
    int r;
    char m[5], path[20];

    scanf("%s", path); 
    /*Scanf can be dangerous because it can cause buffer overflow, 
    it means that you can fill your variable with more bytes than it supports, which can end up being used for buffer overflow attacks:                     
    See more: http://en.wikipedia.org/wiki/Buffer_overflow */
    fin = fopen(path, "r");
    r = fread(&m, sizeof(char), 4, fin);
    m[4] = '\0';

    printf("magic number is %s\n", m);

    return 0;
}