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

如何实现打印含指定字母重复≥3次的单词?代码问题排查

问题分析与修复方案

你的代码存在多个关键问题,导致无法实现预期功能,下面逐一说明并给出修复:

1. 可变参数未正确遍历

你声明了可变参数函数,但完全没有处理第一个字符串之外的其他输入参数。由于不能使用<stdarg.h>,可以通过指针偏移手动遍历栈上的参数:函数参数在栈上连续存储,第一个参数k之后是str,后续每个字符串的地址可通过str的地址加上sizeof(char*)的偏移获取。

2. 无效循环逻辑

原代码中的for (int i = 0; i < k; i++)仅重复给length和j赋值,没有实际遍历每个输入字符串;后续的while (j < length)完全多余,且循环内未递增j,会导致无限重复处理同一个字符串。

3. strtok使用错误

  • strtok会修改原字符串,且第一次调用后必须传入NULL才能获取下一个单词,原代码重复调用strtok(str, " ")会每次从头解析,引发死循环。
  • 每个字符串需独立调用strtok解析,不能在多个字符串间混用NULL。

4. 单词重复输出问题

遍历单词字符时,同一个单词会因多个字符满足条件(或同一字符被多次遍历)重复打印,比如wooords里的每个o都会触发一次输出,需找到第一个符合条件的字符后立即跳出循环。

修复后的代码

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

int count_char(char *str, char c) {
    int count = 0;
    while (*str != '\0') {
        if (*str == c) {
            count++;
        }
        str++;
    }
    return count;
}

void print_words_with_repeated_letter(int k, char *str, ...) {
    // 指针遍历可变参数,不依赖<stdarg.h>
    char **current_str = &str;
    for (int i = 0; i < k; i++) {
        char *temp_str = *current_str;
        // 复制原字符串,避免strtok修改原数组(若允许修改原数组可跳过此步)
        char buf[256];
        strcpy(buf, temp_str);
        
        // 增加标点作为分隔符,更准确拆分单词
        char *word = strtok(buf, " ,.");
        while (word != NULL) {
            int has_repeated = 0;
            for (int j = 0; j < strlen(word); j++) {
                int char_count = count_char(word, word[j]);
                if (char_count >= 3) {
                    has_repeated = 1;
                    break; // 找到符合条件的字符后立即停止检查
                }
            }
            if (has_repeated) {
                printf("存在重复三次及以上字母的单词:%s\n", word);
            }
            word = strtok(NULL, " ,.");
        }
        current_str++; // 移动指针到下一个字符串参数
    }
}

int main() {
    char str1[] = "This is a sample sentenceccc.";
    char str2[] = "Another sentence, with more wooords.";
    print_words_with_repeated_letter(2, str1, str2);
    return 0;
}

修复说明

  • 用char **current_str = &str遍历可变参数,每次循环后current_str++获取下一个字符串地址。
  • 增加,.作为分隔符,避免标点与单词绑定(比如原代码中的sentenceccc.会被拆分为sentenceccc)。
  • 新增has_repeated标记,找到符合条件的字符后立即跳出循环,避免同一单词重复打印。
  • 可选使用buf复制原字符串,防止strtok修改传入的原数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:00:24