【发布时间】:2014-02-24 10:07:52
【问题描述】:
我正在尝试解析一个文本文件,并将每个不同的单词添加到一个哈希表中,将单词作为键,将它们的频率作为值。问题被证明是阅读部分:该文件是一个非常大的“普通”文本文件,因为它有标点符号和特殊字符。我想将所有读入的非字母字符视为单词边界。我有一些基本的东西:
char buffer[128];
while(fscanf(fp, "%127[A-Za-z]%*c", buffer) == 1) {
printf("%s\n", buffer);
memset(buffer, 0, 128);
}
但是,当它实际碰到一个前面有空格的非字母字符时,就会窒息(例如,“the,cat was (brown)”将被读作“the cat was”)。我知道该代码有什么问题,但我不确定如何解决它。我是否会更好地阅读整行并手动进行解析?我正在尝试scanf,因为我觉得这是您可以使用格式字符串执行的迷你正则表达式的一个很好的候选者。
【问题讨论】:
-
"%127[A-Za-z]%*[^A-Za-z]"作为一个简单的修复。 -
谢谢!这就是我需要的。
-
使用
while (fscanf(fp, "%*[^A-Za-z]"), fscanf(fp, "%127[A-Za-z]", buffer) == 1 {很好地处理可能以非字母开头的第一个字母组。"%127[A-Za-z]%*[^A-Za-z]"没有。这两种方法都可以很好地处理最后一个字母组,可以选择跟随非字母。 -
很好地使用逗号运算符:)