web-dev-qa-db-fra.com

Comment puis-je dire si la fonction C Atoi a échoué ou si c'était une chaîne de zéros?

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 0s. Il peut également avoir des espaces de tête.

35
Jared

Pour C++ 11 et plus tard:

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.)

10
emlai

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; 
}
23
sbi

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.)

5

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 .

2
Adam Rosenfield