La compréhension d'un atoi() la fonction
Je suis un programmeur python arriver à apprendre le C de K&R livre. Cela va sembler terriblement question triviale, mais je suis perplexe quand même.
Ci-joint est un extrait de code de la K&R (RIP Ritchie!) livre qui met en œuvre la atoi() fonction.
atoi(s) /*convert s to integer */
char s[];
{
int i, n, sign;
for (i=0; s[i]==' '||s[i] == '\n' || s[i] == '\t'; i++)
; /* skip whitespace */
sign = 1;
if (s[i] == '+' || s[i] = '-') /* sign */
sign = (s[i++] == '+') ? 1 : -1;
for (n=0; s[i] >= '0' && s[i] <= '9'; i++)
n = 10 * n + s[i] - '0';
return (sign * n);
}
Mes questions:
1) la première "pour" boucle sert aucun but en plus de compter le nombre de validité characaters?
2) Si (1) est vrai, la première boucle définit la valeur de 'i' pour le nombre de caractères valides - comment est la seconde boucle de travailler sans réinitialisation de i à 0?
Dire par exemple je entrer "2992" comme une entrée de fonction. La première boucle fixe i à 3, alors, comment est le reste de la fonction de travail?
J'ai peut-être mes bases tout foiré, mais toute aide serait vraiment appréciée. Merci, -Craig
- Je n'étais pas au courant que C est terrible.
- Je pense que la meilleure façon de comprendre un morceau de code à exécuter avec un débogueur (e.g gdb), et aller de l'avant, étape par étape. Aussi la lecture du code et les commentaires à l'intérieur peut aider.
- c'est très vieux C. Moderne C est beau... exactement la même chose 🙂 (sauf pour la signature de la fonction, qui est désormais beaucoup plus clair
int atoi(const char * s)
.) - Dans la 2e édition de K&R, la fonction a un peu mieux (et plus moderne) de style ... voir ici: codepad.org/U4hPr4Eg
- C est une croix-plate-forme de l'assembleur, et pas beaucoup plus...rien d'hallucinant par les normes d'aujourd'hui (autres que la portée radicale de son influence et de l'utilisation). Mais à ne pas confondre avec les goûts de C++11, qui est un profond changement radical de la bête pour ceux qui ont la patience pour apprendre.
Vous devez vous connecter pour publier un commentaire.
Ici est l'idée derrière ATOI.
1) Vous réglez le pointeur au début de la char tableau
2) Et puis à l'intérieur de la boucle while vous passez au dessus de chaque personnage et de le multiplier par 10 et ajouter du caractère en les soustrayant par 0.
Et, si vous essayez 2992. le nombre serait 2992 ainsi.
La première boucle n'est que le commentaire dit: il ignore les espaces.
Après elle,
i
est l'index du premier caractère non-blanc, ce qui est exactement ce dont vous avez besoin pour continuer.Non, la première boucle ignore les espaces, comme le commentaire dit.
Le commentaire fournit la réponse: la première boucle est de ignorer les espaces. Pour
2992
,i
restera0
.La première boucle de progrès j'ai pour pointer vers le premier caractère non-blanc.
Le conditionnel entre les boucles en fait la remarque de le signer, le cas échéant.
Puis le final de la boucle de la conversion réelle.
Enfin, le signe est appliquée, et le résultat est retourné.
1) pas de première boucle for ne compte pas le nombre de caractère, mais il compte la première place de numéro si seulement à partir de caractères sont des espaces-je.e pour cette "-2992" je vais être à 1 et pour "2992" je vais être 0.
2)
sign = (s[i++] == '+') ? 1 : -1;
cette déclaration vérifie si le i\'th char est un signe et rend le compteur augmenter par 1[i++] et pour la prochaine boucle ce je est les premiers chiffres dans la chaîne. si j'ai fait 0 alors pour la première conditionnelle d'entrée de votre vérification de la charte aura de la place!edit1: la première entrée est "l'espace de l'espace-2992"