Как заменить определенные символы в строке другими символами - PullRequest
4 голосов
/ 22 ноября 2010

Я пытаюсь создать программу, которая будет принимать в качестве входных данных строку и заменять все гласные символом *.Таким образом, для "hello world" star_vowels должен возвращать "h * ll * w * rld".

На данный момент у меня есть код:

int star_vowels(char s[]){

    int j;

    j = 0;
    while (s[j] != '0'){
        j++;
        if (s[j] = 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u'){
            putchar('*');
        } else {
            putchar(j);
        }
        return 0;
    }
}

Ответы [ 3 ]

6 голосов
/ 22 ноября 2010

В этом коде есть несколько ошибок.

1) while (s[j] != '0') Я вполне уверен, что вы хотите проверять NUL-символ, а не символьную константу ноль. Изменить '0' на '\0'

2) j++ Вы увеличиваете j прежде, чем вы даже посмотрите на 0-й индекс вашего массива. Если бы у вас была гласная в s [0], это было бы пропущено. Переместите j++ в самый конец цикла while, непосредственно перед конечной скобкой.

3) s[j] = 'a' Вы используете оператор присваивания = здесь, когда вам следует вместо этого использовать оператор равенства ==. Использование оператора присваивания является допустимым кодом C и, следовательно, будет компилироваться. К сожалению, он вернет true, и в итоге вы замените всех своих персонажей звездочками

4) putchar(j); Вы пытаетесь вывести 'j' (ваш итератор), когда вы действительно хотите вывести s [j] (ваш персонаж).

5) return 0 так же, как в # 2, ваше заявление о возврате находится не в том месте. У вас это есть в цикле while, когда оно должно быть вне от него. Как вы и написали, цикл while выполнит только первую итерацию до того, как ваша функция выйдет из области видимости.

int star_vowels(char s[]) {

    int j = 0;

    while (s[j] != '\0'){
        if (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u') {
            putchar('*');
        } else {
            putchar(s[j]);
        }
        j++;
    }
    return 0;
}
4 голосов
/ 22 ноября 2010

Я думаю, что ваш вопрос будет «все есть», и это из-за этой части вашего гиганта if:

if (s[j] = 'a'

Это всегда будет правдой. Вам нужно ==

Также вы ставите j++ слишком рано - вы пропустите символы, потому что вы сразу увеличиваете при входе в цикл.

3 голосов
/ 22 ноября 2010

Увеличивая j в начале, вы потеряете индекс 0 (первый символ).

Поскольку вы хотите вернуть новые данные во внешний мир (вне области действия функции),вы либо выделяете память для новых данных вне функции, и передаете указатель этих данных этой функции, либо вы просто выделяете динамическую память внутри этой функции - не забудьте удалить ее.

Одна реализация будет такой:

char *star_vowels(char s[]){
    // let's allocate memory for the new string.
    // its size should be strlen(s) + 1 (the ending char).
    char *final = malloc(strlen(s) + 1); 

    int j = 0;
    while (s[j] != 0){
        if (s[j] == 'a' || s[j] == 'e' || s[j] == 'i' || s[j] == 'o' || s[j] == 'u'){
            final[j] = '*';
        } else {
            final[j] = s[j];
        }
        j++;
    }
    final[j] = 0; // end the string
    return final;
}

Рабочий пример: http://codepad.org/dd2w5cuy

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