【问题标题】:How to extract words from a sentence efficiently in C?如何在C中有效地从句子中提取单词?
【发布时间】:2010-12-06 02:39:09
【问题描述】:

我需要一个高效的函数,将句子的第一秒和其余部分提取为三个变量。

【问题讨论】:

  • 重复 - stackoverflow.com/questions/1483206/… - 但不准确
  • “on-disk”是一个词还是两个词?
  • 你的意思是算法会把“abcd”分成“a”、“b”和“cd”吗?
  • 没有。 “cat eats many rats”应该给出“cat”、“eats”和“many rats”
  • 好吧,我的解决方案应该可以了。试一试。

标签: c string substring


【解决方案1】:

简单方法:使用strtok() 或 strtok_r 获取前两个标记,这会将它们从字符串中删除,因此字符串本身将是您要查找的第三个标记。

困难的方式:自己解析:(

Strtok 在 C 字符串库中,会改变你的原始字符串,所以要小心,如果需要保持原样,请先复制字符串。

可能的例子:

//#include <string.h>

char input[] ="first second third forth";
char delimiter[] = " ";
char *firstWord, *secondWord, *remainder, *context;

int inputLength = strlen(input);
char *inputCopy = (char*) calloc(inputLength + 1, sizeof(char));
strncpy(inputCopy, input, inputLength);

firstWord = strtok_r (inputCopy, delimiter, &context);
secondWord = strtok_r (NULL, delimiter, &context);
remainder = context;

printf("%s\n", firstWord);
printf("%s\n", secondWord);
printf("%s\n", remainder);

getchar();
free(inputCopy);

这应该可以正常工作,并且在原始字符串未变异的情况下是线程安全的。

【讨论】:

  • 另一个问题是 strtok() 使用内部静态变量,因此它不是线程安全的。如果这是一个问题,请使用 strtok_r()。
  • 非常正确,将示例更改为使用 strtok_r
  • 它在提醒中给了我第一个标记,而不是剩下的句子。
  • remainder 将在这里保持“第一”。
  • 啊,我昨晚回家的时候玩了它并修复了这个例子。立即尝试,它应该可以工作。
【解决方案2】:

您需要先定义分隔符。 strtok 有一些问题(它修改了它的论点,其中之一可能会让你陷入困境)。我更喜欢读取字符串并运行自定义解析器,其范围从sscanf 到成熟的解析器。请发布更多详细信息。

【讨论】:

  • +1 sscanf() 会很好用,因为我希望“单词”意味着“任何非空格”,这使得转换说明符变得容易,并且应该巧妙地避免 strtok() 和朋友的所有问题。
【解决方案3】:

【讨论】:

  • @BartłomiejSemańczyk 实际上,如果您取出链接,它仍然会显示strtok,所以它仍然是一个答案。
  • @BartłomiejSemańczyk 我在 09 年回答了这个问题,链接仍然有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多