求多个字符串中,每个字符串的元音字符的个数,以及分别a e i o u的个数

题目是;先输入一个数字,然后要求调用函数求n个字符串中,各自的元音字母的个数,以及每个字符串A E I O U分别的个数。
我的解法是:

#include<stdio.h>
void main() {
    int n;
    char a[80];
    void countvowels(char*p);
    printf("请输入一个数字n:");
    scanf_s("%d",&n);
    for (int i = 1; 1 <= n; i++) {
        printf("输入一个字符串:");
        gets_s(a);
        countvowels(a);
    }
}
void countvowels(char *p) {
    int sum = 0, A = 0, E = 0, I = 0, O = 0, U = 0;
    for (int k = 0; p[k] != '\0'; k++) {
        if (p[k] == 'a' || p[k] == 'A') { sum++; A++; }break;
        if (p[k] == 'e' || p[k] == 'E') { sum++; E++; }break;
        if (p[k] == 'i' || p[k] == 'I') { sum++; I++; }break;
        if (p[k] == 'o' || p[k] == 'O') { sum++; O++; }break;
        if (p[k] == 'e' || p[k] == 'U') { sum++; U++; }break;
    }
    printf("元音字母个数为%d,A有%d个,E有%d个,I有%d个,O有%d个,U有%d个",sum,A,E,I,O,U);

但是在运行过程中会出现以下情况:

img

不知道原因是什么,求解这道题目。

scanf_s("%d",&n)后面加一句getchar()
由于输入n值的时候,你输入了回车键,导致第一次gets_s接收的只是一个换行符,自然统计的都是0了,而且不用你输入内容就会输出了
用getchar()接收掉换行符,这样gets_s就会等待你输入字符串内容啦

因为前面 scanf_s("%d",&n);用户输入了数据和换行符‘\n’,在读取了数据之后,输入缓存里就残留了一个‘\n’。
再次使用gets_s会读取输入缓存里上次残留的‘\n’,也就是读取了一个空字符串,而不是读取新输入的字符。

可以在用 gets_s读取字符前用 setbuf(stdin, NULL); 清除输入缓存。 或者用getchar() 把缓存里上次残留的‘\n’先读取掉

你题目的解答代码如下:

#include<stdio.h>

void main() {
    int n;
    char a[80];
    void countvowels(char*p);
    printf("请输入一个数字n:");
    scanf_s("%d",&n);
    setbuf(stdin, NULL);     //清除输入缓存
    for (int i = 1; i <= n; i++) { // 是 i <= n; 不是数字1
        printf("输入一个字符串:");
        gets_s(a,80);  //gets_s 函数需要提供输入字符串最大长度
        countvowels(a);
    }
}
void countvowels(char *p) {
    int sum = 0, A = 0, E = 0, I = 0, O = 0, U = 0;
    for (int k = 0; p[k] != '\0'; k++) {
        if (p[k] == 'a' || p[k] == 'A') { sum++; A++; } //break会直接跳出for循环, 不要加break
        if (p[k] == 'e' || p[k] == 'E') { sum++; E++; }
        if (p[k] == 'i' || p[k] == 'I') { sum++; I++; }
        if (p[k] == 'o' || p[k] == 'O') { sum++; O++; }
        if (p[k] == 'u' || p[k] == 'U') { sum++; U++; } //p[k] == 'e' 改成 p[k] == 'u'
    }
    printf("元音字母个数为%d,A有%d个,E有%d个,I有%d个,O有%d个,U有%d个\n",sum,A,E,I,O,U);
}

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

gets_s(a);换成scanf_s("%s",&a);


#include<stdio.h>
void countvowels(char *p);
void main() {
    int n;
    char a[80];
    printf("请输入一个数字n:");
    scanf_s("%d", &n);
    printf("输入一个字符串:");
    scanf("%s", &a);
        countvowels(a);
    
}
void countvowels(char *p) {
    int sum = 0, A = 0, E = 0, I = 0, O = 0, U = 0;
    for (int k = 0; p[k] != '\0'; k++) {
        if (*(p + k) == 'a' || *(p + k) == 'A') { sum++; A++; }
        if (*(p + k) == 'e' || *(p + k) == 'E') { sum++; E++; }
        if (*(p + k) == 'i' || *(p + k) == 'I') { sum++; I++; }
        if (*(p + k) == 'o' || *(p + k) == 'O') { sum++; O++; }
        if (*(p + k) == 'e' || *(p + k) == 'U') { sum++; U++; }
    }
    printf("元音字母个数为%d,A有%d个,E有%d个,I有%d个,O有%d个,U有%d个", sum, A, E, I, O, U);


}

需要进行强制类型转化。他将char读取为数字了,所以进行(char)p[k]就可以进行输出了