Des nombres Non-Entiers dans une Chaîne et avec atoi
Si il y a des non-nombre de caractères dans une chaîne de caractères et que vous appelez atoi [je suis en supposant que wtoi va faire la même chose]. Comment atoi traiter la chaîne?
Permet de dire que pour un exemple, j'ai des chaînes de caractères suivantes:
- "20234543"
- "232B"
- "B"
Je suis sûr que 1 sera de retour l'entier 20234543. Ce que je suis curieux de savoir si 2 sera de retour "232." [C'est ce que j'ai besoin pour résoudre mon problème]. Aussi 3 ne doit pas renvoyer une valeur. Sont ces croyances fausses? Aussi... si 2 n'loi, comme je le crois, comment gérer le caractère e à la fin de la chaîne? [Thats généralement utilisé en notation exponentielle]
- Pourquoi ne pas essayer et de voir?
- J'ai pensé que la communauté serait plus rapide que la configuration d'un nouveau projet avec le support de l'unicode.
- "D'essayer et de voir des" œuvres", mais il vous montre seulement le comportement de votre système. Si l'on veut s'assurer que le code est portable, puis la lecture de la norme est la meilleure manière possible. La plupart des réponses ci-dessous relèvent "d'essayer et de voir", et ainsi de décrire comment
atoi
fonctionne sur certains systèmes. - "3 ne devrait pas retourner une valeur à" - comment cela devrait être possible avec un non-
void
type de retour? - Désolé je voulais dire de la valeur à dire d'un non-null.
- Quelqu'un downvoted cette question? C'est un peu idiot.
- Il n'y a pas de "e" de caractères à la fin d'une chaîne de caractères dans cette question.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez tester ce genre de chose vous-même. J'ai copié le code de la Cplusplus site de référence. Il ressemble à votre intuition sur les deux premiers exemples sont corrects, mais le troisième exemple renvoie '0'. "E" et " e "sont traitées comme des" B " est dans le deuxième exemple aussi.
Ainsi, les règles sont
atoi
lors de l'entrée ne peut pas être représenté par un nombre entier n'est pas défini, de sorte que vous ne peut pas le tester vous-même; tout test qui invoque un comportement indéfini n'est pas valide. Cplusplus.com ne le dit pas, mais cplusplus.com est notoirement peu fiables de référence. Ce que vous avez cité sont les règles pourstrtol
, mais adapté pour s'appliquer àint
au lieu delong
(ce qui signifie qu'ils n'ont pas vraiment d'appliquer une fonction à tous). Lorsque vous avez besoin d'une autorité de citation, utiliser la norme. Lorsque vous avez besoin d'un guide de référence rapide, utilisation cppreference.com.atoi
comme ayant le même comportement questrtol
qui gère les principaux espaces vides (le cas échéant), puis des chiffres, puis tous les caractères non reconnus (le cas échéant) (pubs.opengroup.org/onlinepubs/009695399/functions/strtol.html). Dans ton deuxième exemple,strtol
frappe les caractères non reconnus et abandonne.Selon la norme, "Les fonctions
atof
,atoi
,atol
, etatoll
nécessité de ne pas affecter la valeur de l'expression entièreerrno
sur une erreur. Si la valeur du résultat ne peut pas être représenté, le comportement est indéfini." (7.20.1, Numérique des fonctions de conversion en C99).Donc, techniquement, tout peut arriver. Même pour le premier cas, depuis
INT_MAX
est assuré d'être au moins 32767, et depuis 20234543 est plus que cela, il pourrait échouer.Pour une meilleure vérification d'erreur, utilisez
strtol
:Si vous avez besoin d'analyser des nombres avec un "e" dans leur (notation exponentielle), alors vous devriez utiliser
strtod
. Bien sûr, ces chiffres sont à virgule flottante, etstrtod
retournedouble
. Si vous voulez faire un entier, tu peux faire une conversion après la vérification de la plage correcte.sizeof(int)>=4
trop.0
la plus pratique. Cette fonction convertit le nombre habituel de la bases automatiquement, en particulier avec la base 10 pour normal décimal et hexadécimal si le numéro commence par0x
.Si atoi rencontre un non-nombre de caractère, elle renvoie le nombre formé jusqu'à ce point.
atoi
lit les chiffres de la mémoire tampon jusqu'à ce qu'il ne peut pas plus. Il s'arrête lorsqu'il rencontre un personnage qui n'en est pas un chiffre, à l'exception d'espaces (dont il ignore) ou un " + " ou " - " avant, il a vu tous les chiffres (qu'il utilise afin de sélectionner le bon signe pour la suite). Elle renvoie 0 si elle ne voyait pas de chiffres.Donc, pour répondre à vos questions spécifiques: 1 retourne 20234543. 2 renvoie 232. 3 renvoie 0. Le caractère 'e' n'est pas d'espaces, d'un chiffre, '+' ou '-' donc atoi s'arrête et revient s'il rencontre de ce personnage.
Voir aussi ici.
J'ai essayé d'utiliser atoi() dans un projet, mais il ne fonctionne pas s'il y avait des non-caractères numériques dans le mélange, et ils sont venus avant les chiffres - il va revenir à zéro. Il semble ne pas l'esprit si ils viennent après les chiffres, pour quelque raison que ce soit.
Voici une jolie os à nu string en int convertisseur que j'ai écrit jusqu'qui ne semble pas avoir ce problème (bare bones en ce qu'il ne fonctionne pas avec les nombres négatifs et il n'intègre pas de toute erreur de manipulation, mais il pourrait être utile dans certains cas). J'espère que ça pourrait être utile.
Écrire du code simple et à la recherche pour voir ce qu'elle fait est magique et éclairante.
Sur le point n ° 3, il ne reviendra pas "rien". Il ne peut pas. Il va revenir à quelque chose, mais que quelque chose ne sera pas utile pour vous.
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/