例如,在main();
中,您从文件中读取一个字符串,并将其扫描到静态声明的char数组中。然后创建一个动态分配的char数组,长度为strlen(string(。
例如:
FILE *ifp;
char array_static[buffersize];
char *array;
fscanf(ifp, "%s", array_static);
array = malloc(sizeof(char) * strlen(array_static) + 1);
strcpy(array_static, array);
在将静态分配的数组复制到动态分配的数组中后,我们能对它做些什么吗?还是让它在内存中腐烂?如果是这样的话,您甚至应该经历使用malloc创建数组的麻烦吗?
这只是一个假设性的问题,但考虑到内存优化,什么是最好的解决方案?
以下是如何让你的生活更轻松:
/* Returns a word (delimited with whitespace) into a dynamically
* allocated string, which is returned. Caller is responsible
* for freeing the returned string when it is no longer needed.
* On EOF or a read error, returns NULL.
*/
char* read_a_word(FILE* ifp) {
char* word;
/* Note the m. It's explained below. */
if (fscanf(ifp, "%ms", &word) != 1)
return NULL;
return word;
}
scanf格式中的m
限定符表示:
- 可选的'm'字符。这与字符串转换(
%s
、%c
、%[
(一起使用,使调用方无需分配相应的缓冲区来保存输入:相反,scanf((分配一个足够大小的缓冲区,并将该缓冲区的地址分配给相应的指针参数,其应该是指向CCD_ 6变量的指针(该变量在调用之前不需要初始化(。当不再需要这个缓冲区时,调用者应该随后释放(3(这个缓冲区
它是标准C库的Posix扩展,因此任何希望与Posix兼容的实现都需要它,例如Linux、FreeBSD或MacOS(但不幸的是,不是Windows(。所以,只要你使用其中一个平台,它就很好。