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

C程序开发求助:字符串分割令牌、统计元音及筛选单词,程序无输出

解决C程序字符串分割与元音统计问题

我来帮你搞定这个问题!你的思路完全没问题,strtok确实是分割空格分隔单词的高效工具,现在程序没输出主要是因为几个关键细节没处理好——比如头文件缺失、元音判断逻辑错误、计数器没重置,还有strtok的后续调用没跟上。

先分析你代码里的核心问题:

  • 缺少<string.h>头文件:strtok是这个头文件里的函数,不包含的话可能导致编译错误或运行异常
  • gets函数不安全:它会导致缓冲区溢出,建议用fgets替代
  • 元音判断用了赋值=而非比较==:原代码里的if (*r =...是把值赋给*r,不是判断是否为元音,这直接破坏了原字符串,还导致逻辑错误
  • 元音计数器contor没有在每个单词开始时重置:会累计之前单词的元音数,导致统计错误
  • 没有调用strtok(NULL, " ")获取下一个单词:循环只会停留在第一个单词
  • 遍历单词字符后没有判断是否输出:统计完元音数后,没做>2的判断和输出操作

修正后的完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // 必须包含这个头文件才能用strtok

int main() {
    char s[100], *r;
    int contor;
    char c;

    printf("s = ");
    // 用fgets替代gets,避免缓冲区溢出
    fgets(s, sizeof(s), stdin);
    // 去掉fgets读取到的换行符(如果存在)
    s[strcspn(s, "\n")] = '\0';

    // 第一次调用strtok分割字符串
    r = strtok(s, " ");
    while (r != NULL) {
        contor = 0; // 每个单词开始时重置元音计数器
        // 遍历当前单词的每个字符
        for (int i = 0; r[i] != '\0'; i++) {
            c = r[i];
            // 判断是否为元音(包含大小写)
            if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' ||
                c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {
                contor++;
            }
        }
        // 如果元音数超过2,输出该单词
        if (contor > 2) {
            printf("%s\n", r);
        }
        // 获取下一个单词
        r = strtok(NULL, " ");
    }

    return 0;
}

代码关键部分解释:

  • 替换gets为fgets:fgets会限制读取的字符数,避免缓冲区溢出,之后用strcspn去掉换行符,保证字符串格式正确
  • 重置计数器:每次处理新单词时,把contor设为0,确保统计的是当前单词的元音数
  • 完整的元音判断:包含大小写的元音字母,避免漏统计大写的情况
  • 遍历单词字符:用for循环遍历每个字符,统计元音数量
  • 获取下一个单词:strtok(NULL, " ")会继续分割之前的字符串,直到返回NULL表示所有单词处理完毕

现在运行这个程序,输入类似Hello world programming test apple,就会输出programming和apple啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:33:04