如果我正在尝试扫描未知长度的字符串,那么一次扫描输入一个字符并构建链接列表以创建字符串是一种好方法吗?我目前面临的唯一问题是我不确定如何一次处理字符串一个字符串而不要求用户一次输入一个字符串字符串,这是不合理的。有更好的方法吗?我想避免mallocing一个任意大的char数组只是为了容纳大多数字符串。
答案 0 :(得分:2)
在我的建议中,有一个链表的字符将是非常糟糕的主意,因为它会为单个字符串消耗太多内存。
相反,您可以分配标称大小的缓冲区(例如128个字节)并继续读取字符。一旦你觉得,缓冲区几乎已满,分配另一个当前大小加倍的缓冲区,并将第一个缓冲区的内容复制到第二个,释放第一个缓冲区。像这样,你可以继续,直到完全读完你的字符串。
此外,在我编写或看过的大多数程序中,将保持字符串大小的上限,如果字符串输入看起来超出大小,程序将返回错误。字符串大小的上限是根据应用程序上下文确定的。对于Ex:如果您正在读取的字符串是名称,它通常不能超过32个(或某些x值)字符,如果是,则截断该名称以适合缓冲区。通过这种方式,缓冲区可以首次分配给上限大小。
这只是一个想法。可能有许多其他方式可以解决这个问题,而不是链接列表。
答案 1 :(得分:1)
暂时忽略 node-per-char 链接列表的过度使用内存使用情况,并假设您实际构建了它并将字符串放入其中。你能真正使用它吗?
例如:
printf()
,strlen()
,fwrite()
)只是不兼容或者是一种痛苦与...合作。至于更好的方法:它实际上取决于你将如何处理字符串。 (例如,如果您可以处理字符串,可能您甚至不需要将整个内容保存在内存中。)
答案 2 :(得分:0)
将其存储在数组中。使用固定大小的数组初始化数组,并在读取输入时将它们存储在数组中。当数组已满且新输入到来时,创建一个更大的double size数组,并在较新的数组中复制旧数组。现在继续在这个数组中添加新的字符。重复此过程,直到您已读取所有数据。您可以通过以下方法优化将字符从旧数组复制到新数组的过程
1)Initialize a variable old_idx to 0
2) When a new char comes (after the old array is full) then create a new array of double size of older one and copy the new char at old_size+1 index. Also copy the data at index old_idx in old array at old_idx in newer array.
3)Increment old_idx
最后,检查一下old_idx< old_array_size然后复制其余的旧数据。
整个过程的摊销成本非常低,这也是java中ArrayList的工作原理。
Array over linklist的优点是显而易见的
1) Less memory footprint
2)Faster linear access (as in array all the memory allocations for data happen in contiguous manner)