0
votes

Comment ne pas accepter un flotteur lors de la saisie d'un int en C ++

J'essaie actuellement d'écrire un programme à l'école impliquant un générateur de nombres aléatoires pour rouler un dés. J'ai écrit le code avec succès, mais j'essaie de l'améliorer de manière à ce que la taille des dés et le nombre que l'utilisateur tente de rouler peut être choisi par l'utilisateur.

J'ai écrit du code qui fait cela, et je J'ai également ajouté du code qui répète la demande d'entrée si la valeur incorrecte (c.-à-d. Pas l'une des tailles de dés proposer ou tenter de rouler un numéro en dehors de la plage de dés) ou de type d'entrée (c.-à-d. Var au lieu de INT) est saisi. Cependant, si un numéro de point flottant est entré et que le numéro à gauche du point flottant est dans la plage de valeurs correcte, il utilise ce numéro. P>

Par exemple: P>

    while (size != 6 && size != 12 && size != 20 || !(cin >> size))
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Invalid number entered. Choose the size of the dice to roll (6, 12 or 20): ";
        cin >> size;
    }


3 commentaires

Vous pouvez lire comme une chaîne string et essayer de Convertir le Chaîne à un entier et vérifiez si toute la chaîne a été convertie ou non.


Non liée: si CIN est fermé la boucle continuera pour toujours.


Malheureusement, CIN est totalement inutile. Je recommande de conseiller par certainsProGrammerDude.


4 Réponses :


0
votes

Vous pouvez lire un flotteur, attribuez-le à une variable entière, puis comparez les deux. Quelque chose sur ces lignes: xxx

qui étant dit, des flotteurs (et des doubles en double) font l'expérience d'erreurs d'arrondi, de sorte qu'un autre utilisateur suggère, le pari le plus sûr est de lire une chaîne et d'analyser vous-même, ou en utilisant une fonction intégrée comme std :: stoi () (uniquement pour les entiers) et std :: stof () (pour les flotteurs).


1 commentaires

Cela ne corrigera pas le comportement des entrées telles que 6f contenant un nombre valide et des caractères.



0
votes

La façon dont CIN >> Certain_int_variable interprétera l'entrée est le caractère par caractère, jusqu'à ce qu'il s'arrête de donner un sens en tant qu'ob. Par exemple, lorsqu'il rencontre . ou f , CIN est fait la lecture de celui INT.

Si vous voulez un comportement différent, vous allez devez la mettre en œuvre vous-même. Spécifiquement, comment arrêtez-vous de traiter une entrée et commence à traiter le suivant?

CIN >> Quelqu'un_int_variable s'arrêtera quand il n'est plus valide, CIN> > Certains_std_string_variable s'arrêtera quand il rencontre un caractère d'espace blanc (de nouvelles lignes incluses). Que diriez-vous de votre problème? Comment voulez-vous séparer une entrée de la suivante?

Si l'espace blanc est une approche sensible, vous pouvez le faire: xxx

Voir le DOCS pour STD :: Stoi () .


2 commentaires

Salut Ivella, merci pour les conseils, ce que vous dites a du sens (même si le code ne le fait pas, je suis assez nouveau à cela, je préférerais laisser la fonctionnalité plutôt que de soumettre le code que je ne comprends pas .) Toutefois, quand j'ai ! (CIN >> DIESSIZE) Dans la condition tandis que Just ! CIN , il fait ce que je veux ce que je veux Ne lira pas 12,4 ou 6F, etc. en tant qu' Int et me dis-je correctement de saisir un numéro à nouveau, mais si j'entraîne une valeur correcte (6 12 ou 20), il ne semble pas l'enregistrer.


Parce que CIN >> DitSize essaie de lire à nouveau l'entrée. Si le caractère suivant est un nombre, cela fonctionne et écrase la valeur précédente de desize , de sorte que vous le perdiez. Si le caractère suivant est . ou r , il échoue et que vous obtenez le message d'erreur. Aussi, voir ceci:

0
votes
template<typename T>
T typed_read_line(const std::string& prompt)
{
   T result{};
   std::string l;
   std::cout << prompt << ":";
   while (std::getline(std::cin, l)) {
      std::istringstream line{l};
      line >> result >> std::ws;
      if (line.eof()) break;
      //line contains more then expected
      std::cout << "Again: " << prompt << ":"; 
   }
   return result;
}
https://godbolt.org/z/dfYKe3Or version with extra validation or v3.

0 commentaires

0
votes

Merci beaucoup à tous ceux qui ont participé à cela. Ce que j'ai fini par faire était: xxx


0 commentaires