J'ai entendu dire que je devrais utiliser strtol
au lieu de atoi
en raison de sa meilleure gestion des erreurs. Je voulais voir si je pouvais utiliser ce code pour vérifier si une chaîne est un entier:C++: vérifier si chaîne est un entier valide en utilisant "strtol"
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
string testString = "ANYTHING";
cout << "testString = " << testString << endl;
int testInt = strtol(testString.c_str(),NULL,0);
cout << "errno = " << errno << endl;
if (errno > 0)
{
cout << "There was an error." << endl;
cout << "testInt = " << testInt << endl;
}
else
{
cout << "Success." << endl;
cout << "testInt = " << testInt << endl;
}
return 0;
}
Je l'ai remplacé ANYTHING
avec 5
et cela a fonctionné parfaitement:
testString = 5
errno = 0
Success.
testInt = 5
Et quand je le fais avec 2147483648
, le plus grand possible int + 1, elle renvoie ceci:
testString = 2147483648
errno = 34
There was an error.
testInt = 2147483647
assez juste. Mais, quand je l'essaye avec Hello world!
, ce arrive:
testString = Hello world!
errno = 0
Success.
testInt = 0
Qu'est-ce que je voulais faire ici? Et s'il vous plaît ne me donnez pas quelque chose de compliqué pour quelque chose d'aussi simple que de valider qu'une chaîne est un int.
utilisant: GNU compilateur GCC, Code :: Blocks, Windows
"Avez-g ++ suivre le 11 C++ standard langue ISO C++ [std = c 11 ++]" a été cochée dans "Drapeaux de compilation".
passe argument approprié au lieu de 'null' à [strtol] (http: //www.cplusplus.com/reference/cstdlib/strtol /) pour connaître la plage valide. – Jarod42
[Aucun repro] (http://coliru.stacked-crooked.com/a/021660de72cf66f4) pour votre 2ème cas de test. –
@ πάνταῥεῖ, Cela dépend si 'long' peut contenir ce nombre. Un «long» de 32 bits ne peut pas. – chris