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; }
4 Réponses :
Vous pouvez lire un flotteur, attribuez-le à une variable entière, puis comparez les deux. Quelque chose sur ces lignes: 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 () code> (uniquement pour les entiers) et
std :: stof () code> (pour les flotteurs). P > p>
Cela ne corrigera pas le comportement des entrées telles que 6f code> contenant un nombre valide et des caractères.
La façon dont 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? P> Si l'espace blanc est une approche sensible, vous pouvez le faire: p> CIN >> Certain_int_variable code> 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
. Code> ou
f code>,
CIN code> est fait la lecture de celui INT.
CIN >> Quelqu'un_int_variable CODE> s'arrêtera quand il n'est plus valide,
CIN> > Certains_std_string_variable code> 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? P>
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) CODE> Dans la condition tandis que Just
! CIN code>, 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 code> 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 code>, de sorte que vous le perdiez. Si le caractère suivant est
. Code> ou
r code>, il échoue et que vous obtenez le message d'erreur. Aussi, voir ceci:
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.
Merci beaucoup à tous ceux qui ont participé à cela. Ce que j'ai fini par faire était:
Vous pouvez lire comme une chaîne string i> 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 code> est fermé la boucle continuera pour toujours.
Malheureusement,
CIN code> est totalement inutile. Je recommande de conseiller par certainsProGrammerDude.