strtol () renvoie une valeur incorrecte

J’ai un étrange ici. strtol, atol et atoi retournent tous une valeur incorrecte lorsque je passe la chaîne suivante:

long test = strtol("3087663490", &p, 10); 

D’après mon débogueur, il renvoie 2147483647. Je suis complètement perplexe à ce sujet. Aucun conseil?

Votre valeur est supérieure à ce qu’un type long signé peut représenter. Essayer:

 unsigned long test = strtoul("3087663490", &p, 10); 

(Vous obtenez 2147483647 puisqu’il s’agit de LONG_MAX ou 0x7FFFFFFF)

strtol() correctement les erreurs de strtol() est délicat. Vous avez besoin d’un code similaire à celui ci-dessous:

 #include  #include  #include  #include  int main() { char *n = "3087663490"; char *p; long test; errno = 0; test = strtol(n, &p, 10); if (p == n) printf("No digits found.\n"); else if ((test == LONG_MIN || test == LONG_MAX) && errno == ERANGE) printf("Value out of range.\n"); else printf("Value is %ld\n", test); return 0; } 

En cours d’exécution, cela montre quel est votre problème – Value out of range. . Utilisez un type plus large, comme long long (et strtoll() ).

Il semble long est un type 32 bits sur votre système. Si tel est le cas, 3087663490 est supérieur à LONG_MAX . De la page de strtol(3) :

Si un débordement se produit, strtol() renvoie LONG_MAX .

Vous devez utiliser un type non signé pour représenter ce nombre sur votre ordinateur:

 unsigned long test = strtoul("3087663490", &p, 10); 

Devrait bien fonctionner.

À votre retour de strtol, vérifiez la valeur de p . Je pense que si vous dépassez la limite de taille, la valeur de retour sera LONG_MAX et le pointeur sera toujours pointé sur un chiffre plutôt que sur un espace ou du texte.

Et je vois aussi après vérification que errno sera réglé sur ERANGE .