如何为字符串动态分配内存?
我想将文本文件作为输入,并希望将文件的字符存储为字符串。
首先,我计算文本文件中的字符数,然后为此大小动态分配字符串,然后将文本复制到字符串。
main()
{
int count = 0; /* number of characters seen */
FILE *in_file; /* input file */
/* character or EOF flag from input */
int ch;
in_file = fopen("TMCP.txt", "r");
if (in_file == NULL) {
printf("Cannot open %s\n", "FILE_NAME");
exit(8);
}
while (1)
{
ch = fgetc(in_file);
if (ch == EOF)
break;
++count;
}
printf("Number of characters is %d\n",
count);
char *buffer=(char*)malloc(count*(sizeof(char)));
}
答案 0 :(得分:2)
这是一个糟糕的解决方案。您可以使用大量方法确定文件的大小(搜索tell
文件大小,特别是fstat
),并且您可以直接mmap
将文件存入内存,你正是那个缓冲区。
答案 1 :(得分:0)
一种选择是一次读取一个固定大小的块文件,并在读取文件时扩展动态缓冲区。如下所示:
#define CHUNK_SIZE 512
...
char chunk[CHUNK_SIZE];
char *buffer = NULL;
size_t bufSize = 0;
...
while ( fgets( chunk, sizeof chunk, in_file ) )
{
char *tmp = realloc( buffer, bufSize + sizeof chunk );
if ( tmp )
{
buffer = tmp;
buffer[bufSize] = 0; // need to make sure that there is a 0 terminator
// in the buffer for strcat to work properly.
strcat( buffer, chunk );
bufSize += sizeof chunk;
}
else
{
// could not extend the dynamic buffer; handle as necessary
}
}
此代码段一次最多可从in_file
读取511个字符(fgets
将零终止目标数组)。它将为每个块分配和扩展buffer
,然后将输入连接到buffer
。为了使strcat
正常工作,目标缓冲区需要以0结尾。第一次在最初分配缓冲区时不能保证这一点,尽管它应该在后续迭代中进行。
另一种策略是每次将缓冲区大小加倍,这样可以减少realloc
次调用,但这可能更容易理解。