如何实现打印含指定字母重复≥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
相关产品推荐
相关产品推荐

