J'essaye de programmer un jeu textuel pour un projet à l'école. Je vais bien jusqu'à présent, mais étant le perfectionniste que je suis, je voulais avoir des noms alphabétiques uniquement pour le personnage du joueur. J'y travaille depuis des heures pour essayer de trouver la solution. Je pense que le problème pourrait résider dans le fait que je me confond avec trop de boucles. Là encore, je ne suis pas vraiment le meilleur juge pour cela. Voici ce que j'ai en termes de code; c'est un peu brouillon. Ne vous inquiétez pas de mon utilisation de goto.

while(cin >> name){
    for(int x = 0; x < name.length(); x++){
        char c = name.at(x);
        while(!isalpha(c)){
            cin.clear();
            cin.ignore(1000, '\n');
            cout << "Names are alphabetical only, with no spaces.\n";
            cin >> name;
            for(int x = 0; x < name.length(); x++){
                char c = name.at(x);
                if(isalpha(c))
                    goto breakingout;
            }
        }
    }
    breakingout:
        break;
}

Quelques autres choses que je veux qui m'ont peut-être gêné étaient que je voulais que le message d'erreur n'apparaisse qu'une seule fois (il apparaîtrait plusieurs fois sur plusieurs caractères non alphabétiques dans une entrée) également, donc des points bonus pour tous ceux qui peuvent m'aider avec ça :)

0
Brannon Penrod 26 nov. 2017 à 19:10

3 réponses

Meilleure réponse

Pour vérifier si une chaîne contient des caractères non alpha, vous pouvez utiliser des algorithmes standard tels que {{X0 }}, C ++ intègre également std::find_if des fonctions utiles telles que { {X2}} qui renvoie un bool au lieu d'un iterator, c'est-à-dire:

bool containsOnlyAlphaChars = std::all_of(name.begin(), name.end(), [](char c){ 
   return std::isalpha(c);
});

Mise à jour: votre code peut être réécrit comme:

bool containsOnlyAlphaChars = false;
while(!containsOnlyAlphaChars){
    std::cin >> name;

    containsOnlyAlphaChars = std::all_of(name.begin(), name.end(), [](char c){ 
        return std::isalpha(c);
    });

    if(!containsOnlyAlphaChars){
        std::cout << "Names are alphabetical only, with no spaces.\n";
    }
}
2
George 26 nov. 2017 à 17:23

Vous ne pouvez utiliser qu'une seule boucle et une instruction goto comme celle-ci:

string name;
cout << "Enter your name: ";
cin >> name;

   breakingout:
   for(unsigned i = 0; i != name.size(); i++) {
       char c = name.at(i);
       if(!isalpha(c)) {
           cout << "Enter your name without numbers: ";
           cin >> name;
           goto breakingout;
       }
   }

Ou avec des itérateurs comme celui-ci, il est recommandé en C ++.

string name;
cout << "Enter your name: ";
cin >> name;

   breakingout:
   for(auto iter = name.cbegin(); iter != name.end(); iter++) {
       if(!isalpha(*iter)) {
           cout << "Enter your name without numbers: ";
           cin >> name;
           goto breakingout;
       }
   }
0
Stephane Wamba 26 nov. 2017 à 18:59

Peut-être quelque chose de plus comme ça?

bool isDone = false;
while(!isDone)
{
    string input;
    getline(cin, input);
    isDone = true;
    for(int i = 0; i<input.size(); i++)
    {
        if(!isAlpha(input[i]))
            isDone = false;
    }
}
0
Jake Freeman 26 nov. 2017 à 16:16
47498194