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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:45:04