Удаление гласных из строки c без использования строковых функций c - PullRequest
3 голосов
/ 14 июля 2020

Я пытаюсь удалить гласные из массива userInput, а остальные скопировать в массив newString. Я думал, что цикл через userInput и присвоение его newStrin будет работать, но я получаю только первый символ массива newString. Я вижу, что на итерации, где i = 2, 't' должно быть присвоено newString [2], но когда я пытаюсь распечатать массив обратно в main, он печатает только первый символ.

void removeVowels( char newString [], char userInput []){
    int i = 0;
    while ( i < myStrlen(userInput)) {
        if ( (userInput[i] != 'a')&&
             (userInput[i] != 'e')&&
             (userInput[i] != 'i')&&
             (userInput[i] != 'o')&&
             (userInput[i] != 'u')){
             newString[i] = userInput[i]; 
             cout << newString[i] << endl; 
        }
        i++;
    }
}

Мой вывод:

c

t

cat without vowels is: c

Ожидаемый результат:

c

t

cat without vowels is: ct

Ответы [ 2 ]

4 голосов
/ 14 июля 2020

Единственная часть, которую вам не хватает, это отслеживание места для записи в

int writePos = 0; 

Затем, чтобы заменить newString[i] = userInput[i]; на newString[writePos++] = userInput[i];, который будет писать в нужном месте, затем увеличьте позицию .

И затем исправьте cout соответствующим образом.

Как указывает @SalehMostafa, вы также должны завершить строку нулем, иначе вызывающий будет читать мусор в конце.

newString[writePos] = 0; // at the end before returning
2 голосов
/ 14 июля 2020

в современном C ++

string s = "my lovely cat is jumping in the kitchen again";
auto r = std::remove_if( s.begin(), s.end(), [](auto x) {
    return "aeiou"s.find(x) != std::string::npos; 
} );
s.erase(r, s.end());

[my lvly ct s jmpng n th ktchn gn]

https://godbolt.org/z/eW89b6

...