You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比并找出两个分词字符串中的共同单词?求新解决方案

如何找出两个分词字符串中的共同单词

原代码存在的问题

你提供的代码虽然能实现基本功能,但存在几个明显缺陷:

  • gets函数不安全,会无视缓冲区大小导致溢出,已被C标准废弃
  • strtok嵌套调用会破坏内部状态:strtok依赖静态变量保存分割位置,第二次调用strtok(str2, " ")会覆盖之前的状态,导致后续字符串分割错误
  • strlwr是非标准函数,仅在部分编译器中支持,跨平台兼容性差

改进后的解决方案

以下是更健壮、可移植的实现:

核心思路

  1. 用安全的fgets替代gets读取输入
  2. 基于标准库tolower实现自定义转小写函数,保证跨平台运行
  3. 先将两个字符串分别分割为单词数组,再进行对比,避免strtok嵌套调用的状态冲突
  4. 实现单词去重,避免重复输出相同的共同单词

代码实现

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAX_STR_LEN 100
#define MAX_WORDS 20

// 自定义字符串转小写函数
void to_lower(char *str) {
    while (*str) {
        *str = tolower((unsigned char)*str);
        str++;
    }
}

// 将字符串分割为单词数组,返回单词数量
int split_words(char *str, char words[][MAX_STR_LEN]) {
    int count = 0;
    char *token = strtok(str, " \n"); // 同时处理空格和换行符
    while (token != NULL && count < MAX_WORDS) {
        strcpy(words[count], token);
        count++;
        token = strtok(NULL, " \n");
    }
    return count;
}

// 找出并输出两个单词数组中的共同单词(去重)
void find_common_words(char words1[][MAX_STR_LEN], int count1, 
                       char words2[][MAX_STR_LEN], int count2) {
    int i, j;
    int output_flag[MAX_WORDS] = {0}; // 标记单词是否已输出

    for (i = 0; i < count1; i++) {
        if (output_flag[i]) continue;
        for (j = 0; j < count2; j++) {
            if (strcmp(words1[i], words2[j]) == 0) {
                printf("%s ", words1[i]);
                output_flag[i] = 1;
                // 清空words2中已匹配的单词,避免重复匹配
                strcpy(words2[j], "");
                break;
            }
        }
    }
}

int main() {
    char str1[MAX_STR_LEN], str2[MAX_STR_LEN];
    char words1[MAX_WORDS][MAX_STR_LEN], words2[MAX_WORDS][MAX_STR_LEN];
    int count1, count2;

    printf("请输入字符串1:");
    fgets(str1, MAX_STR_LEN, stdin);
    str1[strcspn(str1, "\n")] = '\0'; // 去除fgets读取的换行符

    printf("请输入字符串2:");
    fgets(str2, MAX_STR_LEN, stdin);
    str2[strcspn(str2, "\n")] = '\0';

    // 统一转小写,忽略大小写差异
    to_lower(str1);
    to_lower(str2);

    // 分割字符串为单词数组
    count1 = split_words(str1, words1);
    count2 = split_words(str2, words2);

    printf("\n输出:\n");
    find_common_words(words1, count1, words2, count2);
    printf("\n");

    return 0;
}

运行示例

请输入字符串1:The quick Brown FOX jumped over the LAzy dog
请输入字符串2:Hey Quick brown cat and dog

输出:
quick brown dog 

内容的提问来源于stack exchange,提问作者helloworld123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:16:21