繁体   English   中英

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

[英]How to allocate memory for a String Dynamically?

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

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

在此先感谢您的帮助。

您是在第二个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);

要么

  1. malloc最大可能的长度
  2. 读到malloc块
  3. 找出字符串的真正结尾在哪里
  4. 在您的malloc块中写一个\\0 ,这样它就可以作为以nul终止的字符串正常工作(和/或也可以保存长度,以防您需要)
  5. (可选)将块重新分配为正确的大小

要么

  1. m为长度分配合理的猜测值N
  2. 读了那么多
  3. 如果在该缓冲区中找不到字符串的结尾:
    1. 将带有realloc的缓冲区增长到2N (例如),然后将接下来的N个字节读入末尾
    2. 转到3
  4. 如上写一个\\0

您在评论中说,最高 字符串长度是有界的,因此第一种方法可能很好。 您没有说出如何确定字符串的结尾,但是我假设有一些定界符,或者它用空格右填充。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM