【发布时间】:2022-01-21 07:37:14
【问题描述】:
我一直在尝试使用从this 答案中获得的代码读取文件。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
char * readfile(FILE * f)
{
char * buffer = 0;
long length;
if (f)
{
fseek(f, 0, SEEK_END);
length = ftell (f);
fseek(f, 0, SEEK_SET);
buffer = malloc(length);
if (buffer) fread(buffer, 1, length, f);
fclose(f);
}
return buffer;
}
int main()
{
FILE * f = fopen("./file.txt", "r");
printf(readfile(f));
}
我的函数确实返回文件的内容,但它也返回随机字符。
contents╪▐>c☻ú
令人惊讶的是,每次我运行代码时它们似乎都会发生变化。
contents╗╙ÿ▓.┤
我的文件的内容是“内容”。
我的问题是:如何修复我的代码以使其不返回随机字符?
【问题讨论】:
-
C 中的字符串需要 NUL 终止。
malloc(length+1)然后在freadNUL 之后终止以使其成为有效的 C 字符串buffer[length]='\0' -
你应该像这样在缓冲区字符数组中添加空终止字符
buffer[length]='\0' -
另外,如果文件可能包含
%s,这会带来安全风险。printf的第一个参数应该始终 是字符串文字,或者最坏的情况是使用字符串文字参数调用format_arg函数的结果。