我编写了一个小程序,从.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;
}

发布于 2015-04-06 18:23:53
你打印它就好像它是一个字符串,在C中,这意味着它是以NUL结尾的。像这样修改您的代码,它将如您所期望的那样工作:
char m[5];
m[4] = '\0'; /* add terminating NUL */另外,您应该知道 is a dangerous function。使用命令行参数代替。
发布于 2015-04-06 18:24:39
问题不在于你的阅读方式。问题是您的变量只有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;
}https://stackoverflow.com/questions/29477053
复制相似问题