计算C中一系列字符串中的元音数量

席勒

我正在用C编写一个程序,该程序对用户确定的一系列字符串中的元音数进行计数,即使字符串的元素数也由用户确定。问题在于该函数始终提供相同数量的元音,这是第一个字符串中的一个。

这是代码:

#include <stdio.h>
#include <string.h>

int vowels(char str[]);

int main(){
    int n, i, x;

    printf("How many strings do you want to insert?");
    scanf("%d", &n);

    printf("How many characters per string?");
    scanf("%d", &x);
    char str[x];

    if(x < 10){
        for(i = 0; i < n; i++){
            printf("Insert a string:");
            scanf("%s", str);

            if(strlen(str) == x){
                vowels(str);
            }
            else{
                printf("Error\n");
            }
        }
    }
    else{
        printf("Error: the number of characters must be < 10");
    }

    return 0;
}

int vowels(char str[]){
    int i, j;

    while(str[i] != '\0'){
        if(str[i] == 'a' || str[i] == 'A' || str[i] == 'e' || 
           str[i] == 'E' || str[i] == 'i' || str[i] == 'I' || 
           str[i] == 'o' || str[i] == 'O' || str[i] == 'u' || 
           str[i] == 'U'){
            j++; }
    i++;
    }

    printf("Number of vowels in the string:%d\n", j); 

return 0;
}

罗伯特·卡波尼

您的代码包含两个错误:

  1. i函数的j索引vowels()未初始化,因此它们包含垃圾,将导致循环的意外行为。这是因为局部变量与全局变量不同,默认情况下不会初始化为0。

改用

int i=0, j=0;
  1. 缓冲区char str[x];将不能包含x个字符的字符串。实际上,字符串终止符character需要的空间'\0'

所以应该是

char str[x+1];

通过这些更改,您的代码将可以工作。

但...

...但这还不够。实际上,当您获得输入字符串时,您不会对返回的字符数进行任何检查:

scanf("%s", str);

通过插入一个很长的字符串,您将超出字符串的范围str,从而导致不确定的行为,并可能导致程序崩溃。

如何解决?由于输入字符串的最大长度为9,因此请定义一个固定长度的数组

char str[11];

为什么选择11号?首先,您的数组必须包含最多9个字符和终止符。因此10。但是它还必须包含一个额外的字符,以便输入更长,可以检测到9个字符。

之后,只需接收输入字符串

scanf("%10s", str);

这样,可以存储所有合法的输入字符串(从大小1到大小9)。所有长度大于或等于10个字符的字符串都将被截断为10个字符的字符串,并且长度检查将按预期失败。

请注意,如果是长字符串,则所有超过前10个字符的字符都不会在stdin缓冲区中保留因此,如果发生错误,您需要一种机制来消耗这些字符,否则您将在next处找到它们scanf我写了这个把戏:

while( fgets( str, 10, stdin ) != NULL )
{
    if( strlen(str) < 10 )
        break;
}

产生的代码,包括我描述的所有更改,如下所示:

#include <stdio.h>
#include <string.h>

int vowels(char str[]);

int main(){
    int n, i, x;

    printf("How many strings do you want to insert?");
    scanf("%d", &n);

    printf("How many characters per string?");
    scanf("%d", &x);

    if(x < 10){
        char str[11];
        for(i = 0; i < n; i++){
            printf("Insert a string:");
            scanf("%10s", str);

            if(strlen(str) == x){
                vowels(str);
            }
            else{
                printf("Error\n");
                while( fgets( str, 10, stdin ) != NULL )
                    if( strlen(str) < 10 )
                        break;
            }
        }
    }
    else{
        printf("Error: the number of characters must be < 10");
    }

    return 0;
}

int vowels(char str[]){
    int i=0, j=0;

    while(str[i] != '\0')
    {
        if(str[i] == 'a' || str[i] == 'A' || str[i] == 'e' || 
           str[i] == 'E' || str[i] == 'i' || str[i] == 'I' || 
           str[i] == 'o' || str[i] == 'O' || str[i] == 'u' || 
           str[i] == 'U')
        {
            j++;
        }
    i++;
    }

    printf("Number of vowels in the string:%d\n", j); 

    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何用sed替换一系列字符串中的一系列数字

从一系列单元格中计算单元格中的子字符串(excel)

在 Google 表格中,如何计算一系列单元格内特定的单个文本字符串?

计算一系列字符串在列表中出现的次数 - Python

R从列中的一系列行中删除字符串字符

计算C中一致字符串的数量

如何用R中的字符串字符替换一系列int值

为什么 <= 在 Python 中评估字符串的一系列字符?

从一系列列中的字符串中删除不需要的部分

如何在 kotlin 中搜索句子中的一系列字符串

在一系列列表中重新分配字符串值

将字符串添加到一系列git commits消息中

如何根据Google表格中的一系列值动态创建字符串

Python:在字符串中查找一系列汉字并应用函数

如何将熊猫列中的一系列字符串转换为整数

JQuery:使数组中的一系列字符串按顺序淡入淡出

Java中带计数器的一系列字符串操作

计算合并字符串中的元音数量

计算字符串中的元音数量并返回Python计数?

使用一个错位的字符串打印一系列字符串

如何在C++中的字符串中打印从一个索引到另一个索引的一系列字符

计算字符串中唯一元音的数量

包含一系列子字符串的字符串的聚合计数

如何批量从一系列字符串的左侧修剪字符串?

从红宝石中的一系列字符串数组中获取一组数字

是否有一个函数可以“评估”字符串中的一系列数字?

如何使用 Bash 从一个文件中提取一系列字符串并替换另一个文件中的一系列单独的字符串?

删除一系列字符串的最后一个字符

在目录中删除一定数量的带有一系列字符的文件