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
相关产品推荐
相关产品推荐

