c - fread 在c中用随机字符填充字符串

标签 c file pointers

我一直在与恐惧作斗争。尽管我添加了字符串结尾字符“\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' 但程序崩溃了(从那时起没有打印任何内容)

这里有一个输出示例:

acks in get_acks: 1, 2, 3, 4 09:09▒

这是文件内容:

cat new_acks.txt: 1, 2, 3, 4

最佳答案

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

你需要改变

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

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

因此,您在 get_acks 中分配的缓冲区最后会得到\0

关于c - fread 在c中用随机字符填充字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43843920/

相关文章:

c++ - 使用 read 从 stdin 读取

c - 在函数内部使用内存分配指针

c - 解决结构数组及其中的 realloc 的一些建议

C 预处理器指令,这是正确的语法吗? #Ifdef foo ||酒吧

c - 如何使用 netfilter 内核模块从 sk_buff 中读取数据?

c - 保存用户 ID 的目的

swift - 字符串(文件内容 :encoding:) aborts with exit status 139

linux - 无法将linux中的本地文件复制到hadoop

c - fgets 实现 (K&R)

c++ - 为什么 auto_ptr 行为异常