Pourquoi puis-je obtenir ce résultat inattendu avec atoi() en C?
Je ne comprends pas les résultats suivants du code C.
main()
{
char s[] = "AAA";
advanceString(s);
}
void advanceString(p[3])
{
int val = atoi(p);
printf("The atoi val is %d\n",val);
}
Ici la atoi
valeur est affiché comme 0, mais je ne pouvais pas comprendre la raison exacte.
Selon ma compréhension, il doit être la somme de l'équivalent décimal de chacune des valeurs du tableau? S'il vous plaît corrigez-moi si je me trompe.
Veuillez coller du code qui compile.
N'a vraiment d'importance dans ce cas?
Peut-être, peut-être pas. Mais est-il vraiment si difficile, étant donné que l'OP a déjà vu le résultat de l'exécution du programme?
parce que ce n'est pas ce
N'a vraiment d'importance dans ce cas?
Peut-être, peut-être pas. Mais est-il vraiment si difficile, étant donné que l'OP a déjà vu le résultat de l'exécution du programme?
parce que ce n'est pas ce
atoi()
est censé faire.strtol
ne ferez pas ce que vous décrivez. Pas de norme en fonction de la bibliothèque de la volonté; ce n'est pas quelque chose que les gens l'habitude de faire.OriginalL'auteur maddy | 2010-04-28
Vous devez vous connecter pour publier un commentaire.
atoi()
convertit une chaîne représentant un nombre entier en sa valeur. Il ne sera pas convertir des caractères arbitraires dans leur valeur décimale. Par exemple:Il n'y a rien dans la bibliothèque standard C qui va convertir "Une" à 65 ou "Z" à 90, vous devez écrire vous-même, en particulier pour tout ce charset vous attend à l'entrée.
Maintenant que vous savez ce
atoi()
n', veuillez ne pas l'utiliser de traiter avec entrée numérique dans tout ce que vous venez avec. Vous devriez vraiment faire face avec la contribution de ne pas être ce que vous attendez. Hmm, ce qui se passe quand je rentre de 65 ans au lieu d'Un? Les enseignants de l'amour de casser des choses.atoi()
ne fait pas de vérification d'erreur que ce soit, ce qui rend tout fier de convertir arbitraire d'entrée fragile, au mieux. Au lieu de cela, utiliserstrtol()
POSIX (centrée sur l'exemple):Lorsqu'il est exécuté, ce qui donne:
Si vous n'avez pas de soins sur l'enregistrement /l'examen de la poubelle, vous pouvez définir le deuxième argument de
NULL
. Il n'est pas nécessaire defree(garbage)
. A noter également, si vous passez 0 en tant que troisième argument, il est supposé que l'entrée est la valeur souhaitée d'un décimal, hexadécimal ou octal représentation. Si vous avez besoin d'une base de 10, de 10 ce sera un échec si l'entrée n'est pas comme vous l'attendez.Vous pouvez également vérifier la valeur de retour pour le maximum et le minimum de la valeur d'un
long int
peut gérer. Toutefois, si un est retourné pour indiquer une erreur,errno
est réglé. Un exercice pour le lecteur est de changer*input
de123abc
àabc123
.Il est important de vérifier le retour, que votre exemple montre ce qui se passe si vous ne le faites pas. AbcDeFg n'est pas une représentation de chaîne de caractères en un nombre entier, et vous avez besoin de votre fonction.
Pour votre mise en œuvre, la plupart des conseils de base, je peux vous donner une série de commutateurs, quelque chose comme:
.. alors juste l'exécuter dans une boucle.
Ou, de pré-remplir un dictionnaire d'une fonction de recherche pourrait champ d'application (mieux). Vous n'auriez pas besoin de tables de hachage, juste une touche -> valeur magasin puisque vous savez ce qu'il va contenir à l'avance, où les caractères ASCII standard sont les touches, et leurs identificateurs correspondants sont des valeurs.
si la réponse est correcte, il serait d'aider plus si la réponse serait de dire que l'OP sur la façon de résoudre son problème.
Croyez le ou non, je viens juste de voir votre commentaire. Édité un peu 🙂
Le
garbage == NULL
tests inutiles. Je ne vois pas de résultat précis destrtol()
qui entraîneraitgarbage == NULL
. FWIWEINVAL
n'est pas dans le C spec.Ne semble pas être l'GNU/Linux spécifique. Commentaire ajouté.
OriginalL'auteur Tim Post
Il essaie de convertir la chaîne de caractères en un entier. Depuis AAA ne peut pas être converti en un entier, la valeur est 0. Essayez de donner à 42 ou quelque chose.
Voir http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
OriginalL'auteur Snake
Lire
atoi()
comme un i (ASCII en entier).atoi()
convertit une chaîne de caractères représentant un nombre décimal à l'entier.OriginalL'auteur Deep
atoi
attend son argument une chaîne représentant un nombre décimal (base 10) constante entière;AAA
n'est pas valide d'un entier décimal constante, de sorte queatoi
renvoie 0 car il n'a pas d'autre moyen d'indiquer que l'entrée est invalide.Noter que
atoi
permettra de convertir jusqu'au premier caractère qui n'est pas partie d'un entier valide constante; en d'autres termes, "123" et "123w" seront tous deux convertis à 123.Comme tout le monde le dit, ne pas utiliser de
atoi
; utilisationstrtol
à la place.OriginalL'auteur John Bode