4

我做了两根弦。用户可以同时填写它们。

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

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

文字=我一生都在这里

Text2= 他们来这里是为了赢得我们所有人

我需要编程找到类似的词,如“这里”、“全部”。我试过这样,但没有找到所有单词。

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

然后 printf 但我认为这不是正确的事情。

4

5 回答 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()因此对您没有太大帮助。而不是 using 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, " ");
}
于 2013-10-15T18:02:47.407 回答
1

您需要使用strtok()和的组合strstr()

拆分text为令牌并在其中strtok()搜索该令牌text2strstr()

为了安全而不是strtok() 你也可以使用strtok_r()

于 2013-10-15T17:53:25.197 回答
1

分解成单词并在使用text中搜索这些单词text2strstr

于 2013-10-15T17:54:53.187 回答
0

我认为有两个线程会对您有所帮助。

如何在C中有效地从句子中提取单词?

在 C 中将字符串拆分为每个空格。

使用带有空格的strtok作为分隔符似乎是将两个字符串解析为单词的一种合适的解决方案。听起来您已经有效地实施了第二步(strsrt)。

于 2013-10-15T17:59:16.777 回答
0

可能的算法实现:

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

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

于 2013-10-15T18:04:52.893 回答