如何对比并找出两个分词字符串中的共同单词?求新解决方案
如何找出两个分词字符串中的共同单词
原代码存在的问题
你提供的代码虽然能实现基本功能,但存在几个明显缺陷:
gets函数不安全,会无视缓冲区大小导致溢出,已被C标准废弃strtok嵌套调用会破坏内部状态:strtok依赖静态变量保存分割位置,第二次调用strtok(str2, " ")会覆盖之前的状态,导致后续字符串分割错误strlwr是非标准函数,仅在部分编译器中支持,跨平台兼容性差
改进后的解决方案
以下是更健壮、可移植的实现:
核心思路
- 用安全的
fgets替代gets读取输入 - 基于标准库
tolower实现自定义转小写函数,保证跨平台运行 - 先将两个字符串分别分割为单词数组,再进行对比,避免
strtok嵌套调用的状态冲突 - 实现单词去重,避免重复输出相同的共同单词
代码实现
#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
相关产品推荐
相关产品推荐

