2010-12-11 44 views
2

Il semble que l'implémentation de LynxOS de strtod ne gère pas tous les mêmes cas que celui de Linux, ou d'ailleurs Solaris. Le problème que j'ai, c'est que j'essaye d'analyser un texte qui peut contenir des nombres décimaux ou hexadécimaux.LynxOS strtod pas le même que Linux

sur Linux J'appelle

a = strtod(pStr, (char **)NULL); 

et je reçois les valeurs attendues dans a pour les chaînes d'entrée telles que 1.234567 et 0x40.

Sur LynxOS, les nombres décimaux analysent correctement, mais l'hex analyse simplement 0 en raison de l'arrêt lorsqu'il atteint le 'x'. En regardant les pages man, il semble que strtod LynxOS ne supporte que les chaînes décimales dans l'entrée.

Est-ce que quelqu'un ici sait d'une alternative qui fonctionnera sur les deux Lynx et Linux?

+1

Bienvenue sur la terre d'Unix. Si vous écrivez à (l'une des) norme (s) POSIX, vous obtiendrez plus de portabilité. Mais cela peut vouloir dire ignorer certaines extensions * très * utiles. – dmckee

+0

@dmckee: Cela n'a rien à voir avec UNIX. Cela a à voir avec OP invoquant UB en appelant une fonction avec la mauvaise signature. Le comportement souhaité n'est même pas spécifique à POSIX; c'est exigé par ANSI/ISO C. –

+0

@R .. N'a même pas regardé cela. Juste répondu à la réclamation des dépendances du système. – dmckee

Répondre

2

Citation de la norme (7.20.1.3) (http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf)

La forme prévue de la séquence sujet est un signe plus ou moins en option, alors l'un des ce qui suit:
- un nonvide séquence de chiffres décimaux contenant éventuellement un caractère décimal , puis une partie d'exposant optionnelle telle que définie au 6.4.4.2;
- un 0x ou 0X, puis une séquence non vide de chiffres hexadécimaux contenant éventuellement un caractère décimal , puis une partie d'exposant binaire optionnelle telle que définie au 6.4.4.2;
- [...]

Ainsi, le compilateur que vous utilisez sur LynxOS n'est pas un compilateur C99.


Ma copie de la norme C89 n'a pas de référence au préfixe 0x:

4.10.1.4 La fonction strtod

[...]

La forme attendue de la séquence sujet est un signe moins ou facultatif, puis une séquence non vide contenant éventuellement un caractère décimal , puis une option partie exposant [...]

+0

Le compilateur est GCC, version 3.2.2, fourni par LynuxWorks. – LordOphidian

+0

Hmmm ... ma réponse a été éditée pour refléter 'C99'. Pour autant que je sache (ma version de la norme C89 n'est pas digne de confiance), pour 'C89', il n'y avait aucune exigence pour' 0x'. – pmg

+0

Je suppose que j'ai besoin de regarder si 3.2.2 était 'C99' conforme, ou juste' C89'. – LordOphidian

-2

strtod prend 3 arguments, pas deux. Si vous l'aviez prototypé en incluant l'en-tête correct ( stdlib.h), votre compilateur aurait émis une erreur. Puisque vous appelez une fonction avec la mauvaise signature, votre programme a un comportement indéfini. Fixez ceci et tout ira bien.

+2

Je pense que vous voulez dire 'strtol' et amis – pmg

+1

-1 Incorrect,' strtod' a le prototype suivant: 'double strtod (const char * restreindre nptr, char ** restreindre endptr);' - pris directement à partir de la norme C99. – JeremyP

+0

En effet, j'ai mal lu et j'ai pensé que la question portait sur 'strtol'. Pour ce que ça vaut, C99 nécessite 'strtod' pour supporter les flottants hexadécimaux (qui nécessitent un exposant, si je me souviens bien) mais C89 ne le fait pas puisqu'ils n'existaient pas en C89. –