C语言编写delete_words函数求助:删除首串中与第二个字符串匹配的单词
实现思路
- 先拷贝待匹配的字符串
w到临时缓冲区,用strtok方法按空格拆分出所有单词,存到指针数组里方便后续快速比对 - 再拷贝原字符串
s到临时缓冲区,同样按空格拆分出每个独立单词 - 遍历
s的所有单词,逐一和w的单词列表做匹配:匹配成功就给删除计数加1,匹配失败就把单词拼接到结果缓冲区,单词之间补空格分隔 - 最后把处理完成的结果拷贝回入参
s,返回删除计数即可
完整可运行代码
#include <stdio.h> #include <string.h> #define MAX_WORDS 100 #define BUF_SIZE 1024 int delete_words(char *s, char *w) { // 拆分w的单词存到数组 char w_copy[BUF_SIZE]; strcpy(w_copy, w); char *w_words[MAX_WORDS] = {0}; int w_count = 0; char *token = strtok(w_copy, " "); while (token != NULL && w_count < MAX_WORDS) { w_words[w_count++] = token; token = strtok(NULL, " "); } // 处理s的单词 char s_copy[BUF_SIZE]; strcpy(s_copy, s); char res[BUF_SIZE] = {0}; int del_count = 0; int res_len = 0; token = strtok(s_copy, " "); while (token != NULL) { int is_exist = 0; for (int i = 0; i < w_count; i++) { if (strcmp(token, w_words[i]) == 0) { is_exist = 1; break; } } if (is_exist) { del_count++; } else { if (res_len > 0) { res[res_len++] = ' '; } strcpy(res + res_len, token); res_len += strlen(token); } token = strtok(NULL, " "); } // 结果写回原s strcpy(s, res); return del_count; } int main() { char s[] = "ab bb cc oh hey there dd"; char w[] = "ab cc dd oho hello"; int count = delete_words(s, w); printf("deleted: %i\nnew_string: %s", count, s); return 0; }
代码说明
- 因为
strtok方法会修改原字符串,所以实现里都先拷贝了入参到临时缓冲区处理,不会修改原始传入的w字符串,符合函数使用的常规预期 - 代码里设置的缓冲区大小和最大单词数满足普通作业场景需求,如需处理更长的输入可以自行调整
BUF_SIZE和MAX_WORDS两个宏定义即可
内容的提问来源于stack exchange,提问作者Raier147
相关产品推荐
相关产品推荐

