-1
votes

Que fait la 2e argument de Strtoul ()?

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).

Cela signifie que le code suivant doit détecter 2 comme numéro hexagonal: xxx

mais, il retourne zéro.

pourquoi?


10 commentaires

La fonction tentera d'analyser la chaîne du Début . 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 endptr , 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. - Quelle est son utilité?


Il pourrait y avoir beaucoup de cas d'utilisation. Le plus souvent, il est utilisé pour vérifier si tout de la chaîne a été analysé (par exemple "123" où le pointeur de fin serait sur le terminateur) ou seulement la partie de début (comme pour "123xyz" où le pointeur de fin serait au 'x' ).


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); i sera 24 , p pointe "- 3" .


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.


3 Réponses :


0
votes

pourquoi?

Il est renvoyé 0 car "p ..." ne suit pas de règles sur la représentation entière. le 2e argument n'est pas pertinent pour votre question.


0 commentaires

1
votes

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.

par exemple: xxx

sortie: xxx

Nous pouvons voir que lorsque strtol renvoie p pointe vers le premier caractère dans str 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.

Dans le cas de votre exemple, le premier caractère de String , nommément "p" n'est pas une base à 10 chiffres, donc rien n'est converti et la fonction renvoie 0.


0 commentaires

0
votes

Le Char ** endptr argument dans tous les fonctions strto * est destiné à recevoir l'adresse du premier caractère qui n'est pas 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 mais que FAT-doigter quelque chose comme 12W4 , strtoul retournera 12 et définissez l'argument EndPTR pour pointer vers w .

Fondamentalement, si le caractère endptr pointe sur WhitSpace ou 0 , l'entrée devrait alors être rejetée probablement.


0 commentaires