我想使用C语言存储动态字符串。
例如
sadasdasda5245sdf
fadfa6456
fasdf90-70 = 790
这些行的数量和每行的长度可以是任何东西。有什么方法可以动态存储整个事物。
答案 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个回复所示,您可以使用指针数组,链表等。
这一切都取决于您的实施要求:
等。我建议您阅读一些有关数据结构并决定最适合您的方法。它们都可以用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 strings和dynamically 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
是您的责任。