我想使用 C 语言动态存储字符串行。
例如
萨达斯达斯达5245sdf
fadfa6456
fasdf90-70=790
这样的行数和每行的长度可以是任何东西。有没有办法动态存储整个东西。
我想使用 C 语言动态存储字符串行。
例如
萨达斯达斯达5245sdf
fadfa6456
fasdf90-70=790
这样的行数和每行的长度可以是任何东西。有没有办法动态存储整个东西。
有几种数据结构允许您动态添加项目,而无需事先知道所需的最大元素数是多少。有链表、二叉搜索树、平衡树、尝试、堆等等。
同样,有很多方法可以动态分配不同长度的字符串。
最简单的方法可能是使用简单的链表:
typedef struct _node {
struct _node *next;
char *value;
} node_t;
您跟踪head,列表中的第一项,并且每个next字段都指向列表中的下一个节点。例如,要遍历列表,您可以编写如下内容:
currentNode = head;
while(currentNode != NULL) {
/* do something with currentNode->value */
currentNode = currentNode->next;
}
在不知道你想做什么的情况下,具体来说,我真的无法提供任何更好的建议。
你想经常对你的数据结构进行哪些操作?您是否会简单地遍历字符串、搜索字符串、添加和删除字符串?
如果您在某个初始化时间知道字符串的数量并且不需要分配更多,则可以使用:
char **myStrings = (char **)malloc(numStrings*sizeof(*myStrings);
然后为每个字符串分配:
for(int i=0; i<numStrings; i++)
myStrings[i] = (char *)malloc(stringLength[i] + 1);
不过,如果需要,您仍然可以更动态地分配。
如果您需要动态重新分配字符串数组:
myStrings = (char **)realloc(myStrings, numStringsNew*sizeof(myStrings));
或者如果特定字符串需要更改其长度,只需重新分配该特定字符串:
myStrings[the_one_to_realloc] = (char *)realloc(myStrings[the_one_to_realloc], stringLengthNew + 1);
有几种数据结构可以让您动态增长。正如前面 2 个回复所建议的那样,您可以使用指针数组、链表等。
这一切都取决于您的实施要求:
等等。我建议阅读一些有关数据结构的内容并确定最适合您的内容。它们都可以在 C 中实现。
查看这篇 Wikipedia 文章(如果您想跳过理论,请转到“示例”部分以获取选项列表)
跑步,不要走路,去普林斯顿的网站,获取 Dave Hanson 的C Interfaces and Implementations。调用的数据结构Seq_T
非常适合动态构建行列表。Dave 不提供缓冲读取器,但您可以将行读入有限缓冲区,使用 转换结果Text_put
,如果一行对于一个缓冲区来说太大,则使用 连接结果Text_cat
。CII 代码为您管理所有动态增长。
char *variable;
scanf ("%ms", &variable);
/* use variable */
free(variable);
所指向的字符串variable
足以保存数据。
请注意,free
变量使用后由您负责。