使用C动态存储字符串行

时间:2009-07-25 17:13:40

标签: c string dynamic-data line

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

例如

sadasdasda5245sdf

fadfa6456

fasdf90-70 = 790

这些行的数量和每行的长度可以是任何东西。有什么方法可以动态存储整个事物。

6 个答案:

答案 0 :(得分:7)

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

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

最简单的方法可能是使用简单的linked list

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

不知道你想做什么,具体来说,我无法提供更好的建议。

您希望经常对数据结构执行哪些操作?你是否只是简单地遍历字符串,搜索字符串,添加和删除字符串?

答案 1 :(得分:3)

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

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

  1. 您是否会多次访问这些字符串?
  2. 一旦你获得它们,你是打算一次性访问它们(进行一些计算)还是一次一个(即字典)?
  3. 你的空间/记忆考虑是什么?
  4. 您获得它们的顺序是否重要(建议队列或堆栈实现)?
  5. 字符串之间是否存在内在联系(表示树状或树状结构)?
  6. 等。我建议您阅读一些有关数据结构并决定最适合您的方法。它们都可以用C实现。
    看看this Wikipedia article(如果你想跳过理论,请转到“示例”部分获取选项列表)

答案 2 :(得分: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);

答案 3 :(得分:2)

跑步,不要走路,到Princeton web site然后去 戴夫汉森的C Interfaces and Implementations。名为Seq_T的数据结构非常适合动态构建行列表。 Dave不提供缓冲读取器,但您可以将行读入有限缓冲区,使用Text_put转换结果,如果某行缓冲区太大,则使用Text_cat加入结果。 CII代码为您管理所有动态增长。

答案 4 :(得分:2)

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

不要开发自己的库,而有几个免费软件库可以实现这样的抽象。其中一个例子是glib,它有很多类型,例如dynamically growing stringsdynamically growing lists

答案 5 :(得分:0)

To store dynamically, use can use the 'm' flag of %s as shown below:

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

variable指向的字符串足以容纳数据。

请注意,使用后变量free是您的责任。