如何动态分配字符串的内存?

我试图从文本文件中读取数据并将其存储在具有一个char指针和一个int变量的结构中。 在从文件中获取数据期间,我知道将有一个要获取的字符串和一个整数值。 我也知道我必须开始提取的位置forms。 我不知道的是字符串的大小。 那么,我该如何为该String分配内存。 示例代码在这里:

struct filevalue { char *string; int integer; } value; fseek(ptr,18,SEEK_SET);//seeking from start of file to position from where I get String fscanf(ptr,"%s",value.string);//ptr is file pointer fseek(ptr,21,SEEK_CUR);//Now seeking from current position fscanf(ptr,"%d",value.integer); 

在此先感谢您的帮助。

  1. malloc最大可能的长度
  2. 在malloc’d块中读到这么多
  3. 弄清楚字符串的真正结束位置
  4. 在你的malloc’d块中写一个\0 ,以便它作为一个以空字符结尾的字符串正确行为(和/或保存长度,以备你需要时)
  5. 可选择将块重新分配到正确的大小

要么

  1. malloc一个合理的猜测N的长度
  2. 读了那么多
  3. 如果你找不到该缓冲区中字符串的结尾:
    1. 使用realloc将缓冲区增长到2N (例如)并将下一个N字节读入结尾
    2. 转到3
  4. 如上所述写一个\0

你在评论中说最多。 字符串长度是有界的,所以第一种方法可能很好。 你还没有说过如何弄清楚字符串的结束位置,但我假设有一些分隔符,或者右边是空格或其他东西。

你的意思是你的第二个fseek()中的SEEK_CUR吗? 如果是这样,那么你知道字符串的长度。 使用固定大小的缓冲区。

如果您知道第一个结构的位置和第二个结构的位置,您还知道第一个结构的总长度( 第二个 位置 – 第一个位置 )。 您还知道结构的整数部分的大小,因此您可以轻松计算字符串的长度。

 off_t pos1; /* Position of first structure */ off_t pos2; /* Position of second structure */ size_t struct_len = pos2 - pos1; size_t string_len = struct_len - sizeof(int); 

我假设您使用fseek以二进制模式打开文件。

您可以使用fgetc()从文件中读取,因为您不知道大小只是分配一个初始大小为100的缓冲区,然后通过char将char放入缓冲区来读取char。 监视缓冲区是否足够大以容纳字符,如果不是realloc()缓冲区为更大的大小。