Je rencontre un problème gênant avec une fonction C++ que j'ai écrite et dont le but est de valider l'entrée de l'utilisateur. La fonction lit l'entrée de l'utilisateur, vérifie s'il s'agit d'un nombre et, si c'est le cas, si elle est dans la plage [min, max].Dysfonctionnement de la chaîne de caractères vers un entier non signé
Le problème se produit lorsque j'appelle la fonction de modèle avec un type non signé, comme size_t
et l'entrée est un nombre négatif. Le flux de chaîne convertit la chaîne en quelque chose comme 4294967291. Je peux voir que le programme convertit les données en une valeur proche de la valeur maximum du type de données non signé (défini dans l'en-tête numeric_limits) mais ma question est pourquoi, depuis l'instruction if
devrait s'arrêter à sstream >> value
?
Mon code:
template <class T>
T getNumberInput(std::string prompt, T min, T max) {
std::string input;
T value;
while (true) {
try {
std::cout << prompt;
std::cin.clear();
std::getline(std::cin, input);
std::stringstream sstream(input);
if (input.empty()) {
throw EmptyInput<std::string>(input);
} else if (sstream >> value && value >= min && value <= max) {
std::cout << std::endl;
return value;
} else {
throw InvalidInput<std::string>(input);
}
} catch (EmptyInput<std::string> & emptyInput) {
std::cout << "O campo não pode ser vazio!\n" << std::endl;
} catch (InvalidInput<std::string> & invalidInput){
std::cout << "Tipo de dados inválido!\n" << std::endl;
}
}
}
Merci pour votre temps!
Ne pas passer un type non signé? – Mud