Зачем прогуливаться радикс, а strtod нет?

Недавно я работал с входом cin и обнаружил, что strtol нужен основание: long int strtol (const char* str, char** endptr, int base);, но это не так: double strtod (const char* str, char** endptr);, Очевидно, что двойные числа могут быть представлены в других базах, так почему эта дихотомия?

2 ответа

Решение

strtol обычно используется с base установлен в 0 или же 10, base==0 заставляет его обрабатывать строку как целочисленную константу C. Он использует ведущий 0 для восьмеричного или ведущего 0x или же 0X для шестнадцатеричной; в противном случае он считается десятичным. С base==10, он не распознает ничего, кроме десятичной (что более удобно для пользователя; большинство пользователей не ожидает ввода 010 быть интерпретированным как 8).

Числа с плавающей точкой могут быть представлены не в десятичной форме, а в C++, но поддерживает только десятичную. (C добавил поддержку шестнадцатеричной плавающей запятой в стандарте ISO C 1999 года, но C++ не принял эту функцию.)

strtod мог бы иметь возможность интерпретировать, например, 1.4 в качестве константы base-8, равной 1.5 десятичная дробь - но просто не достаточно спроса, чтобы оправдать это.

Целочисленный ввод может быть с пользой записан в основаниях 2, 8, 10 и 16, и strtol разрешает другие базы только потому, что это легко сделать. Входные данные с плавающей точкой редко являются чем-то иным, кроме десятичной (и синтаксис шестнадцатеричной константы с плавающей точкой C однозначен, поэтому нет необходимости указывать ее).

Причина этого в том, что в C++ нет способа выразить значение с плавающей запятой в другой базе, отличной от базы 10. Из [lex.fcon] 2.13.4(1)

Плавающий литерал состоит из целочисленной части, десятичной точки, дробной части, e или E, необязательного целочисленного показателя со знаком и необязательного суффикса типа. Целые и дробные части состоят из последовательности десятичных (десятичных) цифр. [...]

акцент мой

Если числа с плавающей точкой могут быть выражены только в базе 10, то нет необходимости указывать базу. целочисленные типы, с другой стороны, могут быть выражены в разных strtol имеет дело с этим.

Другие вопросы по тегам