Selon Ce document ,
Le deuxième argument (CHAR ** ENDPTR) semble être un gaspillage d'espace! Si Il est prêt à NULL, Strtol semble fonctionner dans la chaîne jusqu'à ce que Il trouve un caractère invalide puis s'arrête. Tous les caractères valides sont lus puis converti si la chaîne commence par un caractère non valide le La fonction renvoie zéro (0). P> blockQuote>
Cela signifie que le code suivant doit détecter
2 code> comme numéro hexagonal: p>
xxx pré> mais, il retourne zéro. p>
pourquoi? p> p>
3 Réponses :
pourquoi? p> blockQuote>
Il est renvoyé
0 code> car
"p ..." code> ne suit pas de règles sur la représentation entière. le 2e argument n'est pas pertinent pour votre question. em> p>
La page de l'homme dit ce qui suit sur le deuxième argument:
Si EndPTR n'est pas NULL, STRTOL () stocke l'adresse du premier Caractère non valide dans * endptr. S'il n'y avait pas de chiffres du tout, strtol () stocke la valeur initiale de NPTR dans * endptr (et retourne 0). En particulier, si * nptr n'est pas '\ 0' mais ** endptr est '\ 0' en retour, la chaîne entière est valide. P> blockquote>
par exemple: p>
xxx pré> sortie: p>
xxx pré> Nous pouvons voir que lorsque
strtol code> renvoie
p code> pointe vers le premier caractère dans
str code> qui ne peut pas être converti. Cela peut être utilisé pour analyser la chaîne un peu à la fois, ou pour voir si la chaîne entière peut être convertie ou s'il y a des caractères supplémentaires. p>
Dans le cas de votre exemple, le premier caractère de
String code>, nommément "p" n'est pas une base à 10 chiffres, donc rien n'est converti et la fonction renvoie 0. P > p>
Le Fondamentalement, si le caractère Char ** endptr code> argument dans tous les fonctions
strto * code> est destiné à recevoir l'adresse du premier caractère qui n'est pas em> une partie d'un nombre entier valide (décimal, hex ou octal) ou de point flottant. Loin de l'inutile, il est pratique de vérifier une entrée non valide. Par exemple, si je voulais taper dans
1234 code> mais que FAT-doigter quelque chose comme
12W4 code>,
strtoul code> retournera
12 code> et définissez l'argument EndPTR pour pointer vers
w code>. p>
endptr code> pointe sur WhitSpace ou
0 code>, l'entrée devrait alors être rejetée probablement. p>
La fonction tentera d'analyser la chaîne du Début i>. Et puisque le premier caractère n'est pas un chiffre hexadécimal, il échouera immédiatement (comme documenté < / a>).
Je recommanderais de lire la documentation "officielle" aussi: Port70 .NET / ~ NSZ / C / C11 / N1570.HTML # 7.22.1.4
Eh bien, ce document est faux. Si EndPTR est passé, c'est défini sur le pointeur du premier caractère après le dernier chiffre analysé et souvent très utile.
En ce qui concerne l'argument code> endptr code>, il est déréférencé de redonner un pointeur sur le premier caractère non dénommé dans la chaîne.
@SomeProGrammerDude, Il est déréférencé de redonner un pointeur au premier personnage non dégagé dans la chaîne. I> - Quelle est son utilité?
Il pourrait y avoir beaucoup de cas d'utilisation. Le plus souvent, il est utilisé pour vérifier si tout i> de la chaîne a été analysé (par exemple
"123" code> où le pointeur de fin serait sur le terminateur) ou seulement la partie de début (comme pour
"123xyz" code> où le pointeur de fin serait au
'x' code>).
La qualité du matériau de référence peut être déterminée à partir de son utilisation de la phrase "semble". Cela signifie que l'auteur n'a vraiment pas d'indice.
Avec
char * p; int i = strtoul ("24-3", & p, 10); code>
i code> sera
24 code>,
p code> pointe
"- 3" code>.
Ce document ressemble à l'ordinateur portable personnel de quelqu'un (et de pratique HTML). Il n'a pas été mis à jour Sice 1998 et est fréquemment très, très mal ou obsolète.
Apprentissage C: Règle 1 -> Lisez la documentation. Règle 2 -> N'utilisez pas de documentation de merde.