【发布时间】: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缺少原型不兼容。