Vérifiez si l'entrée est un nombre ou une chaîne de caractères en C++
J'ai écrit le code suivant pour vérifier si l'entrée(answer3) est un nombre ou une chaîne de caractères, si ce n'est pas un nombre, il devrait revenir "Entrer Uniquement des Chiffres" mais ça revient au même pour les nombres. Merci de me suggérer une solution.
#include <iostream>
#include <string>
#include <typeinfo>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
using namespace std;
int main ()
{
string ques1= "Client's Name :";
string ques2 = "Client's Address :";
string ques3 = "Mobile Number :";
char answer1 [80];
string answer2;
int answer3;
cout<<ques1<<endl;
cin>>answer1;
cout<<ques2<<endl;
cin>>answer2;
cout<<ques3<<endl;
cin>>answer3;
if (isdigit(answer3))
{
cout<<"Correct"<<endl;
}
else
{
cout<<"Enter Numbers Only"<<endl;
}
system("pause>null");
return 0;
}
- Est-il quelque chose de mal avec la touche entrée sur votre clavier? La barre d'espace semble douteux ainsi
isdigit
prend un caractère unique comme unint
, l'interprète comme un caractère ASCII, et retourne une valeur non nulle si c'est un chiffre ('0' à '9', ASCII 48 57) ou zéro si elle ne l'est pas. Il n'a aucun moyen de savoir si vous lisez un entier dansanswer3
.- De plus,
cin >> someIntVariable
les rejets principaux espaces, de lit un signe optionnel (-
ou+
), suivie par une séquence de chiffres, de s'arrêter à la première non-chiffre. Donc, si quelqu'un entre dans quelque chose qui ne peut pas être interprété, il définit la variable à 0. C'est pourquoiisdigit
plus tard échoue. - Il ne fait pas de sens d'appeler
isdigit
sur uninteger
, sauf si vous savez précisément ce que cela signifie pour un nombre entier à un chiffre.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
regex
pour ce faire:Si vous voulez faire
isNumber()
une fonction générique qui peut prendre n'importe quel type d'entrée:Ci-dessus
isNumber()
fonction vérifie entier uniquement, lit double ou float valeur avec précision (qui contient dot.
) ne renvoie pas true.Si vous souhaitez une précision trop, puis changer le
regex
ligne:Si vous voulez une solution plus efficace, voir cette une.
Si vous êtes à l'aide de C++98, vous pouvez utiliser
stringstreams
(#include <sstream>
):Si le boost est disponible pour vous, vous pouvez utiliser lexical_cast (
#include <boost/lexical_cast.hpp>
):Si C++11 est disponible pour vous, vous pouvez utiliser le builtin
std::stoi
la fonction de<string>
:SORTIES:
La fonction appel isdigit() est utilisé pour tester uniquement des chiffres ( 0,1,...,9)
utiliser cette fonction pour vérifier les numéros de
L'entrée de
isdigit
est une valeur entière. Cependant, ce sera le retour de la vraie (non nulle) uniquement si la valeur correspond à '0'-'9'. Si vous les convertir en valeurs entières, ils sont 48-57. Pour toutes les autres valeurs,isdigit
retourne false (zéro).Vous pouvez vérifier si vous avez obtenu un nombre entier par l'évolution de la logique de la vérification:
Une autre réponse à l'aide de
strtod
:Pour être en mesure de gérer n'importe quel type de paramètre utiliser le modèle:
Remarque:
NAN
etINF
fera return false (pour être exact, n'importe quel caractère sauf valide exposant fera return false). Si vous souhaitez autorisernan
etinf
, supprimer la|| std::isalpha(s[0])
partie.L'intérêt phénomène sont les
isdigit
nécessitechar
d'être jeté àunsigned char
. (Voir aussi ici).C'est un peu vieille question, mais j'ai pensé que je voudrais ajouter ma propre solution que j'utilise dans mon code.
Une autre façon de vérifier si une chaîne est un nombre est le
std::stod
la fonction, qui a été mentionné, mais je l'utilise un peu différemment. Dans mon cas d'utilisation, j'utilise un bloc try-catch pour vérifier si l'entrée est une chaîne ou un nombre, comme avec votre code:Le principal problème avec cette solution est que les chaînes qui commencent par des chiffres (mais ne sont pas tous les numéros) sera être converties en nombres. Ceci peut être facilement résolu en utilisant
std::to_string
sur le nombre retourné et en la comparant à la chaîne d'origine.