Lorsque vous utilisez la fonction atoi
(ou strtol
ou des fonctions similaires à ce sujet), comment pouvez-vous dire si la conversion entière a échoué ou si la chaîne C convertie en cours était un 0
?
Pour ce que je fais, 0
est une valeur acceptable et la c-string en cours de convertie peut contenir n'importe quel nombre de 0
s. Il peut également avoir des espaces de tête.
La fonction GO-to pour la conversion de chaîne à entière est maintenant ((stoi
, qui prend un string
et retourne un int
ou jette une exception sur l'erreur.
Pas besoin du verbeux istringstream
piratage mentionné dans la réponse acceptée plus.
(Il y a aussi stol
/stoll
/stof
/stod
/stold
pour long
/long long
/float
/double
/long double
conversions, respectivement.)
Comme cela est étiqueté C++ :
template< typename T >
inline T convert(const std::string& str)
{
std::istringstream iss(str);
T obj;
iss >> std::ws >> obj >> std::ws;
if(!iss.eof())
throw "dammit!";
return obj;
}
De la page d'homme pour strtol ():
Si EndPTR n'est pas NULL, STRTOL () stocke l'adresse du premier caractère non valide dans * endptr. S'il n'y avait pas de chiffres du tout, Strtol () stocke la valeur initiale de NPTR dans * endptr. (Ainsi, si * NPTR n'est pas
'\0'
mais ** endptr est'\0'
En retour, la chaîne entière était valide.)
Une alternative à strtol
est sscanf
, bien que ce soit un peu lourd:
const char *numStr = "12345"; // input string
int value;
if(sscanf(numStr, "%d", &value) == 1)
; // parsing succeeded, use value
else
; // error
Cependant, cela permet à la tête de votre chaîne (qui peut être souhaitable ou non), et cela permet de suivre le numéro, de sorte que "123ABC" serait accepté et renvoyer 123. Si vous souhaitez avoir un contrôle plus serré, allez-y avec strtol()
, comme andreyt démontre .