【发布时间】:2018-07-08 23:11:34
【问题描述】:
假设我有 N 个要连接在一起的 char 数组。每个 char 数组都存储在一个单独的结构中。为了访问 stuct1 中的 char 数组,我需要访问 struct2,要访问 struct2 我需要访问 struct3,等等(想象一个单链表,头部在 structN,尾部在 struct1)。
我想连接每个结构中的每个 char 数组,以便 struct1 中的 char 数组首先出现,而 structN 中的 char 数组最后出现。
例如,假设我与 struct1、struct2 和 struct3 关联的 char 数组的内容为“A”、“B”、“C”。我想得到结果字符数组“ABC”。但是,如上所述,要访问 structX,我必须先访问 structX+1。因此,在左侧连接这些 char 数组会更有效率;我不必继续遍历所有结构。
有没有办法在 C 中有效地做到这一点(即 strcat、snprintf 等),还是我必须手动操作每个 char 数组以获得我想要的(或遍历列表,保存指向结构的指针,以及回去工作)?
编辑(清晰) 假设我有一个链接的链表。每个元素都有一个 char 数组。我想以相反的顺序连接字符数组。有没有办法在不通过列表两次的情况下做到这一点?我知道运行时所有 char 数组的最大大小,但在访问列表的每个元素之前我不知道它们各自的大小(当我访问元素 X 时,我知道存储在 X 中的 char 数组的大小)
【问题讨论】:
-
N的最大值是多少? -
为什么不编写自己的函数来将一个字符串附加到另一个字符串?
-
确实有可能,但是您必须确保复制到的缓冲区足够大以适应这些对象的内容,或者在每次迭代时使用
realloc,这可能会很慢。使用 O(2N)(仅分配一次内存时)和 O(N) 方法进行一些基准测试,然后您将看到更好的选择。 -
在问题中显示你的结构。说明你尝试了什么。
-
但是您还没有说或显示其他字段之一是否是 char 数组中字符串的长度(或非字符串的长度 - 没有空终止符 - 数组中的数据)。但是,为了我的钱,您需要两次通过列表,但与您可能需要做的复制相比,这是一个微不足道的成本。如果你不记录结构中数组的长度,你就增加了很多操作成本。您必须知道它们在创建时有多长;不要丢弃有价值的信息。别忘了你可以
realloc()来缩小数组。
标签: c string concatenation