比较两个字符串中的单词

4

我已经创建了两个字符串。用户可以填写它们。

char text[200];
char text2[200];  

我需要从这两个字符串中找到相似的单词。例如,

Text= 我一生都在这里

Text2= 他们在这里赢得我们所有人

我需要编写程序来查找相似的单词,如“这里”、“所有”。我尝试过下面这样,但并没有找到所有单词。

if(strstr(text,text2) != NULL)

然后我尝试使用 printf,但我认为这并不正确。


你知道strstr是做什么的吗? - digital_revenant
7
答案不是一个函数调用,而是需要你实现一个算法。因此,请着手解决问题,思考并设计出解决方案。请注意保持原文意思,同时让内容更易懂,不提供任何额外解释或信息。 - DSquare
如果有一个单一的函数可以做到这一点,那么很可能它不会被分配给你作为一个项目/作业/无论它是什么。查看strstrman页面以了解为什么你尝试的方法不起作用。在text中不会出现text2的[完整]内容。 - Mike
5个回答

5
我认为这是您想要的内容:
char text[] = "I am here for all my life";
char text2[] = "They are here to win us all";

char *word = strtok(text, " ");

while (word != NULL) {
    if (strstr(text2, word)) {
        /* Match found */
        printf("Match: %s\n", word);
    }
    word = strtok(NULL, " ");
}

它使用strtok()逐个单词读取句子,strstr()在另一个句子中搜索相应的单词。请注意,如果您有大量数据块,则需要考虑更智能的算法,否则效率不高。

更新:

由于您不想匹配嵌入的单词,strstr()对您没有太大帮助。您需要使用自定义函数,而不是strstr()。类似下面这样的东西:

#include <ctype.h>
int searchword(char *text, char *word) {
    int i;

    while (*text != '\0') {
        while (isspace((unsigned char) *text))
            text++;
        for (i = 0; *text == word[i] && *text != '\0'; text++, i++);
        if ((isspace((unsigned char) *text) || *text == '\0') && word[i] == '\0')
            return 1;
        while (!isspace((unsigned char) *text) && *text != '\0')
            text++;
    }

    return 0;
}

其他代码不变,但是将对 strstr() 的调用替换为对这个新函数的调用:
char text[] = "I am here for all my life";
char text2[] = "They are here to win us all";

char *word = strtok(text, " ");

while (word != NULL) {
    if (searchword(text2, word)) {
        /* Match found */
        printf("Match: %s\n", word);
    }
    word = strtok(NULL, " ");
}

它可以工作,但是有一件事情:如果 text [] =“房子里的狗” text2 [] =“室内滑板公园”那么匹配就是'in'。 - Einārs Ozols
嗯,我以为你想要那个。你将不得不编写自己的strstr()版本来解决这个问题。我会在几分钟内更新我的答案,提供一个解决方法。 - Filipe Gonçalves
@user2883601,我已经更新了我的帖子,并提供了一个解决办法。在此进行了测试,似乎可以正常工作,请告诉我现在是否可以了。 - Filipe Gonçalves

1
你需要使用 strtok()strstr() 的组合。
使用 strtok()text 拆分为标记,并使用 strstr()text2 中查找该标记。
为了安全起见,您还可以使用 strtok_r() 替代 strtok()

1
text分解为单词,并使用strstrtext2中搜索这些单词。

0

0

可能的算法实现:

  • 从用户获取两个字符串(最好使用char **而不是char *
  • 使用qsort对每个字符串进行排序
  • 从最小的字符串列表的开头开始搜索

注意:最后一步可以在O(n)时间内执行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接