对文件中的字符串进行标记

时间:2011-10-03 20:40:56

标签: c string file tokenize

我有一个文件,我正在对其中的所有字符串进行标记。

因此每个令牌都存储在char *token = (char *) malloc(len + 1);中。令牌在分配新令牌之前被释放,所以我需要一种方法来存储令牌以供进一步使用。

存储令牌的好策略是什么?我有一个函数,一次打印出一个单一的标记字符串。

我的问题不在于如何标记或解析,所以请忽略它的实现。我的问题是,我有一堆字符串在循环中多次分配和释放。那么我如何将每个分配存储在其他地方以供进一步使用?

1 个答案:

答案 0 :(得分:0)

通常,令牌不会存储到文件中。当解析器准备好读取更多输入时,解析器会请求它们。

因此,令牌存储在程序堆的内存中,在处理它们之后(可能在文件完全解析之前很久),它们就被释放了。

---更新以遵循编辑---

如果您担心过度分配和解除分配,那么您有许多解决方案,具体取决于您尝试解决的问题的详细信息。

对于字符串,您可以通过“字符串构建器”界面创建它们,该界面检查字符串是否已存在于该文本中,如果是,则返回对已存在字符串的引用。请注意,要使其正常工作,所有返回的字符串必须是不可变的(因为更改一个引用中的字符串将更改所有引用中的字符串)。数字,布尔值等也可以使用类似的解决方案。

对于令牌重用,您可以将令牌变成一个结构,该结构主要通过指针引用解析器可能“使用”的数据。这样,解析器抓取令牌的“字段”,并且“骨架”令牌可以被添加回“重用队列”。重用队列应该在将令牌返回到令牌化器之前重置令牌的“数据”引用,这将被重写以询问队列的数据结构。如果“队列中没有令牌”,队列应该静默地分配它们。

其他解决方案也存在,取决于你想要的狡猾程度。