Comment atoi() fonction en C++ de travail?
Donc...je sais que la fonction atoi dans la norme C++ de la bibliothèque est censé convertir une chaîne en un entier...comment ça marche?...(J'essaie d'apprendre des trucs et je me demandais juste)...si vous pouviez me montrer le code ou faire votre propre qui permettrait de faire la même tâche, il serait grandement apprécié...merci d'avance.
OriginalL'auteur JacKeown | 2011-04-18
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme ceci:
Boucle les caractères dans la chaîne, tant qu'ils sont des chiffres. Pour chacun, les ajouter au compteur, vous êtes à conserver la valeur à ajouter est la valeur de l'entier du personnage. Ceci est fait en soustrayant la valeur ascii de '0' à partir de la valeur ascii du chiffre en question.
Noter que ce code ne gère pas de débordement. Si vous passez dans "887452834572834928347578423485273" (qui ne rentre pas dans un
int
), le résultat est indéfini.value *= 10;
au sommet de la boucle.Cette additionne les chiffres au lieu de produire le nombre.
Mais notez qu'il peut être une option plus/signe moins devant les chiffres qui n'est pas géré par le présent code. Int est un type signé.
Fixe pour gérer une option de +/- au début. Peut-être que de satisfaire le lecteur-par downvoters.
OriginalL'auteur Graeme Perrow
Chiffre par chiffre:
Un
char *
, à proprement parler, est un pointeur vers unchar
. Un pointeur est une adresse à certains de la place en mémoire. En C/C++ et Java), les chaînes sont constituées de caractères qui peuvent, individuellement, être traités comme des entiers (un octet), grâce à ASCII.En C (et C++), un pointeur vers un élément d'un certain type est le même comme un pointeur vers une tableau des éléments de ce type. Les chaînes en pur C sont juste des tableaux de
char
s, avec un'\0'
(NUL) à la fin de sorte que vous savez quand vous avez atteint la fin d'une chaîne sans avoir à passer autour de sa longueur partout (un pointeur est seulement une adresse, il sait rien à propos de ce qu'il désigne).Ignorer la
const
des mots clés pour maintenant.La version C de
atoi
parcourt chaque caractère dans la chaîne. Le*str++
n'plusieurs choses (il est important de comprendre comment il fonctionne, mais c'est une horrible façon d'écrire C). C'est l'équivalent de*(str++)
. Lestr++
renvoie la valeur destr
(un pointeur) et incrémente d'une unité (mais il renvoie la vieux valeur!). Le*
"déréférence le pointeur, fondamentalement, la lecture dans unchar
de la mémoire. Cettechar
est stocké dansdigit
et puis par rapport àNUL
. Les caractères sont stockés dans un format ASCII, ce qui représente chiffres de manière contiguë, donc on peut juste vérifier quedigit
est entre 0 et 9. Nous savons maintenant que nous sommes de la lecture dans un nouveau chiffre, donc on multiplie la valeur précédente de 10 à la "maj" de la valeur et puis les ajouter dans les chiffres.Pur C version:
Une chaîne C++ est un objet pour faire face à des chaînes plus facile. Vous pouvez obtenir un
char *
à partir d'une chaîne C++ avec.c_str()
.C++ version (plus probablement un inline appel à la char* version avec "retour atoi(str.c_str());"):
Edit: correction d'un problème où <> pourrait ne pas s'afficher correctement.
Edit: C++ version de chaîne ajouté
Edit: Fixe afin qu'il renvoie 123 dans
123a
cas.Edit: Changé errants num n dans C++ version
L'une de vos versions de retourner la valeur 0 pour une chaîne comme "123a", alors que atoi (je crois) serait de retour 123. Joli détail dans la description. +1
Ma compréhension est qu'il serait de retour à zéro si la chaîne n'a pas tous les chiffres en fonction de ceci. Cependant, cette version ne gère pas les signes et n'est pas max/min.
Sur cette page, nous avons ce commentaire: "La chaîne peut contenir des caractères supplémentaires après ceux qui forment le nombre entier, qui sont ignorés et n'ont aucun effet sur le comportement de cette fonction." Si je exécuter l'exemple sur cette page et entrez "1234asdf" je reçois "La valeur saisie est 1234."
Ah, oui, c'est fait. Je n'ai vu les "Si aucun de conversion peut être effectuée, une valeur nulle est renvoyée." de ligne.
OriginalL'auteur Hoa Long Tam
Tourner autour de la question: comment faire vous le faire? Quand vous voyez "31", écrit vers le bas, comment comprenez-vous combien de X il vous faudra compter à l'égalité?
Bien, vous pouvez code.
En réalité est souvent mis en œuvre à partir de la droite de la plupart des caractères pour facile d'utilisation avec des cours d'eau. Comment pourriez-vous le faire?
OriginalL'auteur dmckee
La logique est tout simplement de traiter chaque personnage dans son entier (valeur de réglage pour la position dans la chaîne).
Voici comment je l'ai fait en C#. Même idée générale.
OriginalL'auteur Jonathan Wood
Essentiellement en soustrayant ASCII zéro ('0') et vérifier si c'est un chiffre ou pas. Vous avez besoin de connaître la position:
OriginalL'auteur
Voici une application qui vérifie les conditions d'erreur et fonctionne pour tous les types d'entiers.
OriginalL'auteur Ghostrider