Стандартные функции библиотеки C strtof
и strtod
имеют следующие подписи:Почему параметр endptr для strtof и strtod является указателем на указатель не const const?
float strtof(const char *str, char **endptr);
double strtod(const char *str, char **endptr);
Каждый из них разлагаться входную строку, str
, на три части:
- Начальная, возможно, пустой, последовательность whitespace
- «последовательность объектов» символов, которые представляют значение с плавающей запятой
- «Конечная последовательность» символов, которые являются неотрежимыми (и которые не влияют на преобразование).
Если endptr
не NULL
, то *endptr
устанавливается на указатель на символ непосредственно после последнего символа, который был частью преобразования (другими словами, начало последовательности ведомой).
Я задаюсь вопросом: почему endptr
, то указатель на не- указатель const
char
? Не является ли *endptr
указателем на строку const
char
(строка ввода str
)?
Это в основном та же проблема, что и 'strchr' и друзей, за исключением того, что здесь у нас есть указатель out-param, а не возвращаемое значение. –
@Steve: да, но это более проблематично, чем 'strchr', потому что вы не можете передать адрес указателя' const'-квалифицированного указателя на эти функции без явного приведения. –
Интересный вопрос. В основном это означает, что вы можете скрыть приведение из 'char const *' в 'char *' за функциями 'strtoX'. Weird. –