Comment puis-je vérifier si une chaîne C++ est un int?
Lorsque j'utilise getline
, je voudrais d'entrée d'un bouquet de chaînes de caractères ou des chiffres, mais je ne veux le tout en boucle à la sortie de la "parole", si ce n'est pas un nombre.
Donc, il y a de toute façon de vérifier si le "mot" est un nombre ou non? Je sais que je pourrais utiliser atoi()
pour
C-chaînes de caractères, mais que diriez-vous pour les chaînes de la classe string?
int main () {
stringstream ss (stringstream::in | stringstream::out);
string word;
string str;
getline(cin,str);
ss<<str;
while(ss>>word)
{
//if( )
cout<<word<<endl;
}
}
- En double? stackoverflow.com/questions/1243428/...
Vous devez vous connecter pour publier un commentaire.
Une autre version...
Utilisation
strtol
, l'enveloppant à l'intérieur d'une fonction simple de cacher sa complexité :Pourquoi
strtol
?Autant que j'aime le C++, parfois, l'API C est la meilleure réponse pour autant que je suis concerné:
Comment ça fonctionne ?
strtol
semble assez cru au premier coup d'œil, de sorte que l'explication va rendre le code plus simple à lire :strtol
va analyser la chaîne, s'arrêtant au premier caractère qui ne peut pas être considéré comme faisant partie d'un entier. Si vous fournissezp
(comme je l'ai fait ci-dessus), il définitp
droit à cette première non entier de caractère.Mon raisonnement est que si
p
n'est pas réglé à la fin de la chaîne (le caractère 0), alors il existe un non-entier de caractères dans la chaînes
, senss
n'est pas une bonne entier.Les premiers tests sont là pour éliminer les cas de coin (grands espaces, la chaîne vide, etc.).
Cette fonction doit être, bien sûr, adapté à vos besoins (sont les principaux espaces une erreur? etc.).
Sources :
Voir la description de
strtol
à: http://en.cppreference.com/w/cpp/string/byte/strtol.Voir aussi la description de
strtol
s'sœur fonctions (strtod
,strtoul
, etc.).lexical_cast is overkill and it borders on bad practice
: lorsqu'il est utilisé à la légère, et la même chose peut être dit pour n'importe quel autre élément. L'utilisation réelle de boost::lexical_cast est pour le code générique, ou rapide et sale de code. Générique de code: Lorsque vous avez un type inconnu T, à l'aide d'un commutateur à utiliser strtol, strtol, etc. est une erreur. À l'aide d'un boost::lexical_cast est la bonne chose, en fournissant les boost::lexical_cast spécialisations pour les bons types pour une utilisation efficace. Rapide n'dirty code: Si le code n'a pas besoin de vitesse, puis à l'aide de boost::lexical_cast est la meilleure façon de le faire.lexical_cast
être exagéré, et inefficace, si vous n'avez pas de mesure (ou, si vous l'avez fait, vous n'avez pas afficher les résultats)?Accepté la réponse sera donner un faux positif si l'entrée est un nombre plus du texte, parce que "stol" va convertir les premiers chiffres et ignorer le reste.
J'aime la suite de la version la plus, puisque c'est un joli one-liner qui n'a pas besoin de définir une fonction et que vous pouvez simplement copier et coller partout où vous en avez besoin.
EDIT: si vous aimez cette application, mais vous ne voulez l'utiliser comme une fonction, alors cela devrait le faire:
Vous pouvez essayer de
boost::lexical_cast
. Il jette unbad_lexical_cast
exception en cas d'échec.Dans votre cas:
Si vous êtes juste de vérifier si
word
est un nombre, qui n'est pas trop dur:...
Optimiser comme souhaité.
Vous pouvez utiliser
boost::lexical_cast
, comme l'a suggéré, mais si vous avez aucune connaissance préalable sur les chaînes de caractères (c'est à dire que si une chaîne contient un entier littéral, il n'aura pas tout l'espace de début, ou que les entiers ne sont jamais écrits avec les exposants), puis rouler votre propre fonction doit être à la fois plus efficace, et pas particulièrement difficile.Utiliser le tout-puissant, C stdio/fonctions de chaîne:
sscanf
renvoie le nombre d'éléments appariés, alors votre exemple (commentaires) est erroné. Ou faire j'ai mal compris quelque chose?Ok, la façon dont je le vois, vous avez 3 options.
1: Si vous souhaitez tout simplement pour vérifier si le nombre est un entier, et ne se soucient pas de la conversion, mais souhaitez tout simplement de le garder comme une chaîne de caractères et ne se soucient pas de potentiels débordements, de vérifier si elle correspond à une regex pour un entier serait l'idéal ici.
2: Vous pouvez utiliser boost::lexical_cast et ensuite de prendre un potentiel de boost::bad_lexical_cast exception pour voir si la conversion a échoué. Ce serait bien travailler si vous pouvez utiliser boost et si, à défaut de la conversion est un état exceptionnel.
3: Lancez votre propre fonction similaire à lexical_cast qui vérifie la conversion et renvoie true/false selon si elle est réussie ou pas. Cela ne peut fonctionner que dans le cas 1 & 2 ne correspond pas à vos exigences.
Et puis vous pouvez l'utiliser comme ça:
ou
J'ai modifié paercebal de la méthode pour répondre à mes besoins:
Remarque:
1
, négatif ou la valeur>36
comme base.0
comme la base, il va détecter automatiquement la base je.e pour une chaîne commençant par0x
seront traités comme hex et chaîne commençant par0
seront traités comme des oct. Les personnages sont insensibles à la casse.Ici est une autre solution.