c - 查找字符串中两个连续元音的数量不起作用

标签 c string

当两个元音一个接一个出现时,计数应该递增。但我不知道为什么它递增的不止于此。

#include<stdio.h>
#include<conio.h>
void main(void)
{       
    int i,j,count=0;
    char string[80];
    printf("Enter a string:\n");
    gets(string);
    for(i=0; ;i++)
    {
        if(string[i]=='\0')
            break;
        if(string[i]=='a'||string[i]=='A'||string[i]=='e'||string[i]=='E'||string[i]=='i'||string[i]=='I'||string[i]=='o'||string[i]=='O'||string[i]=='u'||string[i]=='U')
        {
            if(string[i+1]=='a'||string[i]=='A'||string[i]=='e'||string[i]=='E'||string[i]=='i'||string[i]=='I'||string[i]=='o'||string[i]=='O'||string[i]=='u'||string[i]=='U')
            count++;
        }
    }
    printf("%d",count);
    getch();
}

最佳答案

看起来你这里有错字,你的代码:

if(string[i]=='a'||string[i]=='A'||string[i]=='e'||string[i]=='E'||string[i]=='i'||string[i]=='I'||string[i]=='o'||string[i]=='O'||string[i]=='u'||string[i]=='U')
{
    if(string[i+1]=='a'||string[i]=='A'||string[i]=='e'||string[i]=='E'||string[i]=='i'||string[i]=='I'||string[i]=='o'||string[i]=='O'||string[i]=='u'||string[i]=='U')
        count++;
}

注意那里的第二个 if 语句,除了第一个条件之外的所有条件都是检查字符串 [i] 而不是字符串 [i+1]。因此,如果 string[i] 中有“A”,那么无论 string[i+1] 中是什么,这都会增加计数。

你想要:

if(string[i]=='a'||string[i]=='A'||string[i]=='e'||string[i]=='E'||string[i]=='i'||string[i]=='I'||string[i]=='o'||string[i]=='O'||string[i]=='u'||string[i]=='U')
{
    if(string[i+1]=='a'||string[i+1]=='A'||string[i+1]=='e'||string[i+1]=='E'||string[i+1]=='i'||string[i+1]=='I'||string[i+1]=='o'||string[i+1]=='O'||string[i+1]=='u'||string[i+1]=='U')
        count++;
}

我还建议您查看函数 tolower,它将小写一个字符,这意味着您需要进行更少的比较,这将使该代码更易于阅读和维护。您也可以考虑在此处使用开关或任何数组,并可能编写一个辅助函数。

我想我只是无法忍受现在的代码,这是一个更好的版本:

int is_vowel(char ch)
{
    switch (tolower(ch))
    {
    case 'a': case 'e': case 'i': case 'o': case 'u':
        return 1;
    default:
        return 0;
    }
}

然后制作你的 if 语句:

if (is_vowel(string[i]) && is_vowel(string[i+1]))
    count++;

看,更清晰易读,您不觉得吗?

关于c - 查找字符串中两个连续元音的数量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3224555/

相关文章:

c++ - 如何使用 C++ 将不同长度的整个 .txt 文件读入数组?

vb.net - 使用默认形式 String.IsNullOrEmpty(str) 而不是 str.IsNullOrEmpty() 有什么意义吗?

c - 如何使用 sscanf 分析字符串数据?

c 指针初始化为类型转换的数字

c - c中的 vector 复制

c - 无法打印 char* 字符串

c++ - 为什么隐式转换在累积中不起作用?

c# - 字符串中的引号

c - 使用文件夹编译共享库的 Makefile

c# - 如何在某个字符最后一次出现后删除所有文本