C语言 如何调整由函数创建的字符数组中的内存大小?



我用以下命令调用方法:

char * buffer = read_string_from_file();

这是方法:

char * read_string_from_file() {
char * filename = "C:/Users/xxxxx/Dropbox/c-programming-test-file.txt";  // later I will give this as a parameter
char * buffer = 0;
long file_length;
FILE * file = fopen (filename, "r");
if (file)
{
fseek (file, 0, SEEK_END);
file_length = ftell (file);
fseek (file, 0, SEEK_SET);
buffer = malloc (file_length);
if (buffer)
{
fread (buffer, 1, file_length, file);
}
fclose (file);
return buffer;
}
}

该文件包含:

2461866 -3134537

printf("buffer: %snn", buffer);打印buffer时,我buffer: 2461866 -3134537FilesJey┘·å¬.相反,我期望:buffer: 2461866 -3134537.如何调整字符数组buffer的大小?

对于printf("buffer: %snn", buffer);"%s"需要buffer指向一个字符串。 在OP的情况下,它不是,因此UB(额外的垃圾打印(。


如果可以知道长度,只需用fwrite()打印即可

fwrite(buffer, 1, file_length, stdout);

或者由于buffer肯定不是字符串,代码可以使用以下内容,如果file_length < INTMAX

printf("%.*s", (int) file_length, buffer);

更改read_string_from_file()以形成字符串。 附加空字符

// buffer = malloc (file_length);
buffer = malloc (file_length + 1);
if (buffer) {
fread (buffer, 1, file_length, file);
// add
buffer[file_length] = '';
...
printf("buffer: %sn", buffer);

如果没有空字符buffer不是字符串


旁白:健壮的代码也会检查ftell(), fread()的结果。

在 C 中,字符串必须以 NUL 结尾。

例如,您可以执行此操作:

...
buffer = malloc (file_length + 1);  // + 1 for the NUL terminator
buffer[file_length] = 0;            // put NUL terminator
...

最新更新