【问题标题】:C parsing input text file into wordsC将输入文本文件解析为单词
【发布时间】:2015-11-04 21:41:54
【问题描述】:

我正在尝试将输入文件(包含具有多行和分隔符的文本文档,即“!,.?”)解析为单词。我的功能'拆分功能'是:

int splitInput(fp) {

    int i= 0;
    char  line[255];
    char *array[5000];
    int x;
    while (fgets(line, sizeof(line), fp) != NULL) {     
        array[i] = strtok(line, ",.!? \n");
        printf("Check print - word %i:%s:\n",i, array[i]);
        i++;
    }
    return 0;
}

【问题讨论】:

  • 然后呢?问题是什么?什么是预期的输出?你实际上得到了什么?
  • 阅读 strtok 的手册页:cplusplus.com/reference/cstring/strtok
  • @gopi:当你只发送 NULL 时,strtok 应该如何知道要拆分哪个字符串?您必须首先使用指向要拆分的字符串的指针调用 strtok。然后你用 NULL 重复调用它,以获得更多的令牌。
  • 是的,抱歉 - 我刚刚意识到这一点。它仍然不起作用 - 即使用 'line' 替换 NULL。
  • 还是不行具体点。有什么打印的吗?此外,您需要反复调用strok,直到它返回NULL(第一次使用line 作为第一个参数,然后使用NULL 作为参数。

标签: c split strtok


【解决方案1】:

这里是更正后的函数[抱歉额外的样式清理]:

int
splitInput(fp)
{
    int i = 0;
    char *cp;
    char *bp;
    char line[255];
    char *array[5000];
    int x;

    while (fgets(line, sizeof(line), fp) != NULL) {
        bp = line;
        while (1) {
            cp = strtok(bp, ",.!? \n");
            bp = NULL;

            if (cp == NULL)
                break;
            array[i++] = cp;

            printf("Check print - word %i:%s:\n",i-1, cp);
        }
    }

    return 0;
}

现在,查看 strtok 的手册页以了解 bp 技巧

【讨论】:

  • @gopi 不客气!我从不只给出“你应该检查手册页”——对于像你这样已经做出诚实努力的人来说,迂腐/令人沮丧/无用。一种教学方法是给出一两个提示:“您需要一个内部循环并仔细查看 strtok first arg”。更好的。但是,我认为人们可以通过完整的解决方案了解更多 [而且对我来说更容易——这条评论比代码花费的时间更长 :-)]。而且,这就是我学习的方式:阅读其他人的代码并问“他们为什么这样做那个?”。不管怎样,编程愉快!!!
  • 没错。我只是被卡住了,需要推动。非常感谢 - 非常感谢!
【解决方案2】:

如果我正确理解您的问题,您希望阅读每一行并将每一行拆分为单词并将其添加到数组中。

    array[i] = strtok(line, ",.!? \n");

由于显而易见的原因,这将不起作用,因为它只会返回每行的第一个单词,并且您永远不会分配内存。

这可能就是你想要的。

    char *pch;
    pch = strtok(line, ",.!? \n");
    while(pch != NULL) {
      array[i++] = strdup(pch); // put the content of pch into array at position i and increment i afterwards.
      pch = strtok(NULL, ",.!? \n"); // look for remaining words at the same line
    }

之后不要忘记使用free 释放您的数组元素。

【讨论】:

  • @gopi 太好了,不要忘记在printf 之后删除i 的增量,因为那将是多余的。
猜你喜欢
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多