Поиск числа двух последовательных гласных в строке не работает - PullRequest
1 голос
/ 12 июля 2010

Когда два гласных приходят один за другим, счет должен увеличиваться. Но я не знаю, почему он увеличивает его больше, чем это.

#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();
}

Ответы [ 3 ]

5 голосов
/ 12 июля 2010

Похоже, у вас есть опечатка, ваш код:

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].Так что если у вас есть «A» в строке [i], то это будет увеличивать количество независимо от того, что в строке [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++;

Видите, намного чище и легче для чтения, не правда ли?

2 голосов
/ 12 июля 2010

У вас также есть переполнение буфера:

gets(string);

А вот плохой стиль:

for(i=0; ;i++)
    {
        if(string[i]=='\0')
            break;

должно быть

for(i=0; string[i]!='\0';i++)
0 голосов
/ 12 июля 2010

На этот раз будьте как можно ленивее. Если вам нужно повторить часть кода, спросите себя, не можете ли вы сделать это без повторения.

Я бы пошел на это:

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

const size_t MAX_LENGTH = 100;

//Counts the occurrences of two consecutive same characters
//in a string, without case
size_t cnt_doubled(char const * const str, int c) {
    size_t ret = 0;

    //A pointer browses the string until terminating char and
    //increments ret if the pointed char is the one seeked
    //two chars in a row
    for(char const *p = str ; *p != '\0' ; ++p) {
        ret += tolower(*p) == tolower(c) && tolower(*(p+1)) == tolower(c);
    }

    return ret;
}

//Explicit...
size_t cnt_doubled_vowels(char *str) {
    char const *vowels = "aeiouy";

    //A pointer browses the vowels and takes into account
    //the occurrences in the string of every char pointed
    size_t n_vowels = 0;
    for(char const *p = vowels ; *p != '\0' ; ++p) {
        n_vowels += cnt_doubled(str, *p);
    }

    return n_vowels;
}

int main(void) {
    //fgets returns a string terminated by a newline char (before
    //terminating char of course) but in your case it doesn't
    //matter
    char string[MAX_LENGTH] = "";
    fgets(string, MAX_LENGTH, stdin);

    printf("N : %d", cnt_doubled_vowels(string));

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...