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

时间:2012-06-01 07:02:39

标签: c

我正在尝试从文本文件中读取数据&将其存储在具有一个字符指针的结构中。一个int变量。 在从文件中获取数据期间,我知道将有一个字符串来获取&一个整数值。 我也知道我必须开始取位的位置形式。 我不知道的是字符串的大小。 那么,我该如何为该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);

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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);

答案 2 :(得分:0)

无论

  1. malloc最大可能长度
  2. 在malloc'd区块中阅读了很多内容
  3. 找出字符串的实际结尾位置
  4. 在你的malloc'd块中写一个\0,使其行为正确,作为以空字符结尾的字符串(和/或保存长度以备不时之需)
  5. 可选择将您的块重新分配到正确的大小
  6. 或者

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

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

答案 3 :(得分:0)

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

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