首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从.au文件中读取魔术号

从.au文件中读取魔术号
EN

Stack Overflow用户
提问于 2015-04-06 18:19:27
回答 2查看 692关注 0票数 1

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

我不知道为什么会发生这种情况,因为我只读了4个字节,这就是魔术数字的组成。那么,额外的角色是从哪里来的?

代码语言:javascript
复制
#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;
}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-06 18:23:53

你打印它就好像它是一个字符串,在C中,这意味着它是以NUL结尾的。像这样修改您的代码,它将如您所期望的那样工作:

代码语言:javascript
复制
char m[5];
m[4] = '\0';  /* add terminating NUL */

另外,您应该知道 is a dangerous function。使用命令行参数代替。

票数 2
EN

Stack Overflow用户

发布于 2015-04-06 18:24:39

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

带有%s的printf将打印变量的内容,直到达到空字符为止,如果变量没有正确结束,它就可以打印垃圾。要修复这个问题,您可以有一个更大的变量,并将4个字符设置为null。

新代码应该是什么样的:

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29477053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档