如何仅使用scanf提取输入字符串中的元音字母?
用scanf直接提取字符串中的所有元音字母
你的思路其实已经找对方向了,但原代码里的%[aeiou]格式符有个局限——它只能读取连续的一段元音字母,一旦碰到非元音字符就会立刻停止读取。比如你输入"hello world",原代码只会输出"e",而不是你想要的"eo"。
要实现提取所有元音的需求,我们可以通过循环结合scanf的两个格式符来完成:一个用来读取元音,另一个用来跳过非元音。这里是完整的实现代码:
#include <stdio.h> int main(void) { char z[100]; // 建议根据实际需求调整数组大小,避免溢出 int pos = 0; int read_result; // 循环处理输入:读元音 → 跳非元音,直到输入结束 while ((read_result = scanf("%[aeiou]", z + pos)) != EOF) { if (read_result > 0) { // 移动pos到当前存储的元音之后,为下一次读取预留位置 while (z[pos] != '\0') { pos++; } } // 跳过所有非元音字符,%*表示匹配但不存储这些字符 scanf("%*[^aeiou]"); } z[pos] = '\0'; // 手动添加字符串结束符,确保printf能正确输出 printf("%s\n", z); return 0; }
代码细节解释:
- 数组大小:把原代码的
char z[10]改成了更大的数组,防止输入过长时出现缓冲区溢出问题; - pos变量:用来记录当前存储元音的位置,每次读取到元音后,我们会把它移动到新写入的元音末尾;
scanf("%[aeiou]", z + pos):从z数组的pos位置开始,写入读取到的连续元音;scanf("%*[^aeiou]"):%*表示匹配到的内容不存储到变量里,[^aeiou]表示匹配所有非元音字符,这一步会跳过所有非元音,直到遇到下一个元音或者输入结束;- 循环终止条件:当
scanf返回EOF时,说明输入已经结束(比如按下Ctrl+D/Linux/macOS 或 Ctrl+Z/Windows); - 字符串结束符:最后手动添加
'\0',保证printf能正确识别字符串的结尾。
额外小技巧:
- 如果需要同时匹配大写元音(A、E、I、O、U),只需要把格式符改成
%[aeiouAEIOU]即可; - 如果输入长度不确定,也可以用
malloc动态分配内存,进一步提升代码的灵活性。
内容的提问来源于stack exchange,提问作者Vaibbhav
相关产品推荐
相关产品推荐

