5

我想使用 C 语言动态存储字符串行。

例如

萨达斯达斯达5245sdf

fadfa6456

fasdf90-70=790

这样的行数和每行的长度可以是任何东西。有没有办法动态存储整个东西。

4

6 回答 6

7

有几种数据结构允许您动态添加项目,而无需事先知道所需的最大元素数是多少。有链表、二叉搜索树、平衡树、尝试、堆等等。

同样,有很多方法可以动态分配不同长度的字符串。

最简单的方法可能是使用简单的链表

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

在不知道你想做什么的情况下,具体来说,我真的无法提供任何更好的建议。

你想经常对你的数据结构进行哪些操作?您是否会简单地遍历字符串、搜索字符串、添加和删除字符串?

于 2009-07-25T17:20:42.403 回答
3

如果您在某个初始化时间知道字符串的数量并且不需要分配更多,则可以使用:

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);
于 2009-07-25T18:09:51.027 回答
3

有几种数据结构可以让您动态增长。正如前面 2 个回复所建议的那样,您可以使用指针数组、链表等。

这一切都取决于您的实施要求:

  1. 您会多次访问这些字符串吗?
  2. 一旦获得它们,您打算全部访问它们(用于某些计算)还是一次访问一个(即字典)?
  3. 您的空间/内存考虑是什么?
  4. 获取它们的顺序是否重要(建议使用队列或堆栈实现)?
  5. 字符串之间是否存在内在联系(建议树或树状结构)?

等等。我建议阅读一些有关数据结构的内容并确定最适合您的内容。它们都可以在 C 中实现。
查看这篇 Wikipedia 文章(如果您想跳过理论,请转到“示例”部分以获取选项列表)

于 2009-07-25T17:36:34.667 回答
2

与某些答案所暗示的不同,几乎没有理由重新发明轮子。

不要开发自己的库,虽然有几个自由软件库实现了这样的抽象。其中一个示例是glib,它具有多种类型,例如动态增长的字符串动态增长的列表

于 2009-07-25T19:58:49.543 回答
2

跑步,不要走路,去普林斯顿的网站,获取 Dave Hanson 的C Interfaces and Implementations。调用的数据结构Seq_T非常适合动态构建行列表。Dave 不提供缓冲读取器,但您可以将行读入有限缓冲区,使用 转换结果Text_put,如果一行对于一个缓冲区来说太大,则使用 连接结果Text_cat。CII 代码为您管理所有动态增长。

于 2009-07-25T17:53:54.850 回答
0

要动态存储,可以使用%s如下所示的'm'标志:

char *variable;
scanf ("%ms", &variable);
/* use variable */
free(variable);

所指向的字符串variable足以保存数据。

请注意,free变量使用后由您负责。

于 2010-03-04T06:52:24.790 回答