【问题标题】:fread fills string with random character in cfread用c中的随机字符填充字符串
【发布时间】:2017-05-08 09:16:15
【问题描述】:

我一直在与恐惧作斗争。即使我添加了字符串结尾字符'\0',有时字符串末尾也会有一个随机字符。

这是我的代码。

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

uint8_t get_acks(char ** acks);

int main(){
    ...
    char *acks = NULL;
    uint8_t r = get_acks(&acks);
    // test r ...
}


uint8_t get_acks(char ** acks){

    FILE *fp;
    fp = fopen(FILENAME, "r");
    // test fp

    fseek(fp, 0, SEEK_END);
    long len = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    *acks = malloc(sizeof(char)*(len+1));

    fread(*acks, sizeof(char), len, fp);

    acks[len-1] = '\0';

    printf("acks in get_acks: %s", *acks);

    return 0;
}

我也试过 *acks[len-1] = '\0' 但程序崩溃(从那时起没有打印任何内容)

这里有一个输出示例:

get_acks 中的确认:1、2、3、4 09:09▒

这是文件内容:

猫 new_acks.txt: 1、2、3、4

【问题讨论】:

  • acks[len-1] = '\0'; -> (*acks)[len-1] = '\0';
  • @MichaelWalz 谢谢。我的代码中有那个测试。我没有放在这里是为了尽量减少行数。
  • 你为什么用uint8_t作为你的长度? ftell 的返回类型是 long。您应该使用可以包含来自ftell 的所有可能返回值的类型。特别是,-1,如果放入 uint8_t 中,它看起来像长度为 255 而不是失败。
  • 另外,此代码无效,因为返回类型与隐式int/get_acks 缺少原型不兼容。

标签: c file pointers


【解决方案1】:

acks 是双指针,保存来自 main 的acks地址

你需要改变

acks[len - 1] = '\0';

(*acks)[len] = '\0';

所以你在 get_acks 中分配的缓冲区最后会得到 \0

【讨论】:

  • 是的,应该是 (*acks)[len] = 0;
  • 我冒昧地修复了它。
  • @JeremyP 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多