2 votes

Pourquoi le code ne supprime-t-il pas "u" de la chaîne d'entrée ?

Je suis en train d'apprendre le C++. Aujourd'hui, j'ai écrit un code pour enlever les voyelles d'une chaîne de caractères. Il fonctionne bien dans certains tests. Mais ce test ne parvient pas à enlever le "u" d'une chaîne. Mon entrée était: tour. La sortie était: tur. Mais je m'attends à avoir la sortie comme tr pour tour

Code:

#include 
using namespace std;

int main()
{
    string mot;
    getline(cin, mot);
    transform(mot.begin(), mot.end(), mot.begin(), ::tolower);  // Conversion des majuscules en minuscules
    for (int i = 0; i < mot.length(); i++)
    {
        if (mot[i] == 'a' || mot[i] == 'e' || mot[i] == 'i' || mot[i] == 'o' || mot[i] == 'u')
        {
            mot.erase(mot.begin() + i);  // Suppression d'un caractère spécifique
        }
    }
    cout << mot << endl;

    return 0;
}

Comment puis-je faire cela? Où est le problème dans le code?

4voto

cigien Points 11

Lorsque vous effacez un caractère, votre index i est toujours incrémenté, ce qui signifie que vous sautez la vérification des caractères qui apparaissent juste après une voyelle.

Vous devez décrémenter i lorsque vous effacez un caractère :

if (word[i] == 'a' || word[i] == 'e' || word[i] == 'i' || word[i] == 'o' || word[i] == 'u')
{
    word.erase(word.begin() + i);  // Supprimer le caractère spécifique
    --i;  // assurez-vous de vérifier le caractère suivant
}

Voici une démonstration.

Aussi, veuillez éviter les 2 lignes suivantes :

#include 
using namespace std;

Elles sont dangereuses et ne doivent pas être utilisées.

3voto

songyuanyao Points 2265

Après effacer, i++ est effectué. Cela signifie qu'un élément est contourné par la vérification.

Changez la boucle for en

for (int i = 0; i < word.length(); )
{
    if (word[i] == 'a' || word[i] == 'e' || word[i] == 'i' || word[i] == 'o' || word[i] == 'u')
    {
        word.erase(word.begin() + i);  // Suppression caractère spécifique
    } 
    else 
    {
        i++; // incrémenter lorsque aucune suppression n'est effectuée
    }
}

3voto

Ayxan Points 5803

Voici comment vous pouvez le faire plus facilement :

#include 
#include 
#include 
#include 
#include 

constexpr auto isVowel(unsigned char const ch) noexcept {
  constexpr std::array vowels{
      'a', 'e', 'i', 'o', 'u',
  };
  return std::find(vowels.begin(), vowels.end(), std::tolower(ch)) !=
         vowels.end();
}

int main() {
  std::string str = "Tour";
  str.erase(std::remove_if(str.begin(), str.end(), isVowel), str.end());
  std::cout << str << '\n';
}

Essayez en ligne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X