2010-12-11 4 views
2

Кажется, что реализация LynxOS strtod не обрабатывает все те же случаи, что и Linux, или, в этом отношении, Solaris. Проблема в том, что я пытаюсь разобрать текст, который может содержать десятичные или шестнадцатеричные числа.LynxOS strtod не то же самое, что Linux

В Linux я называю

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

и я получить ожидаемые значения в a для входных строк, таких как 1.234567 и 0x40.

В LynxOS десятичные числа обрабатываются правильно, но шестнадцатеричный анализ просто равен 0 из-за остановки при достижении «х». Глядя на страницы руководства, кажется, что strtod LynxOS поддерживает только десятичные строки во входном файле.

Кто-нибудь знает об альтернативе, которая будет работать как на Lynx, так и на Linux?

+1

Добро пожаловать в землю Unix. Если вы напишете (один из) стандарт (ы) POSIX, вы получите большую мобильность. Но это может означать игнорирование некоторых * очень * полезных расширений. – dmckee

+0

@dmckee: Это не имеет никакого отношения к UNIX. Это связано с тем, что OP вызывает UB, вызывая функцию с неправильной подписью. Желаемое поведение даже не зависит от POSIX; это требуется ANSI/ISO C. –

+0

@R .. Даже не смотрел на это. Просто ответил на требования системных зависимостей. – dmckee

ответ

2

Цитата стандарта (7.20.1.3) (http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf)

Ожидаемая формой предметной последовательности является необязательным знаком плюс или минус, то один из следующего:
- непустой последовательность десятичных цифр, необязательно содержащих знак десятичной точки , а затем необязательную экспоненциальную часть, как определено в пункте 6.4.4.2;
- 0x или 0X, затем непустая последовательность шестнадцатеричных цифр, необязательно содержащая знак десятичной точки , а затем необязательную двоичную часть экспоненты, как определено в пункте 6.4.4.2;
- [...]

Итак, компилятор вы используете на LynxOS не компилятор C99.


Моя копия C89 стандарта не имеет никакого отношения к приставкой 0x:

4.10.1.4 Функция strtod

[...]

Ожидаемая форма последовательность субъекта представляет собой необязательный знак плюс или минус, затем непустую последовательность цифр, необязательно содержащую знак десятичной точки , затем необязательный экспоненциальная часть [...]

+0

Компилятор GCC, версия 3.2.2, предоставленный LynuxWorks. – LordOphidian

+0

Хммм ... мой ответ отредактирован, чтобы отразить 'C99'. Насколько я могу судить (моя версия стандарта C89 не заслуживает доверия), для 'C89' не было требования для' 0x'. – pmg

+0

Думаю, мне нужно искать, если 3.2.2 был 'C99' совместимым, или просто' C89'. – LordOphidian

-2

strtod принимает 3 аргумента, а не два. Если вы прототипировали его, включив правильный заголовок ( stdlib.h), ваш компилятор выдал бы ошибку. Поскольку вы вызываете функцию с неправильной подписью, ваша программа имеет неопределенное поведение. Исправьте это, и все будет хорошо.

+2

Я думаю, вы имеете в виду 'strtol' и друзей – pmg

+1

-1 Неправильно,' strtod' имеет следующий прототип: 'double strtod (const char * ограничивает nptr, char ** ограничивает endptr);' - берется непосредственно из стандарта C99. – JeremyP

+0

Действительно, я неправильно понял и думал, что речь идет о 'strtol'. Для того, что стоит, C99 требует, чтобы 'strtod' поддерживал шестнадцатеричные float (которые требуют экспоненты, если я правильно помню), но C89 не существует, так как они не существовали на C89. –

Смежные вопросы