strtod принимает «е», а также «д» - почему? - PullRequest
3 голосов
/ 02 июня 2011

Я нахожу это странным.

Хотя имеет смысл, что strtod принимает 'e' в качестве одного из символов (точнее, одного) во входной строке, я считаю, что он также принимает 'd'.

Может кто-нибудь объяснить, пожалуйста?

#include < stdio.h >
#include < stdlib.h >
int main ()
{
char *s[] = {"1a1", "1e1", "1d1", "1f1"};
char * pEnd;
double d0, d1, d2, d3;
d0 = strtod (s[0],&pEnd);
d1 = strtod (s[1],NULL);
d2 = strtod (s[2],NULL);
d3 = strtod (s[3],NULL);
printf ("::: [%f] [%f] [%f] [%f] \n", d0, d1, d2, d3);
return 0;
}

Ответы [ 4 ]

4 голосов
/ 02 июня 2011

Что вы подразумеваете под "принимает"? Это вывод, который я получаю

::: [1.000000] [10.000000] [1.000000] [1.000000]

strtod (как и все другие процедуры преобразования в C) анализирует строку, пока не найдет символ, который «не принадлежит». Этот символ не считается ошибкой, он просто рассматривается как символ-терминатор. В случае "1d1" только первый "1" анализируется и синтаксический анализ останавливается на 'd'. Результат конвертации 1.0 (как и должно быть).

Если вы попросите strtod возвращать «указатель конца» при каждом вызове, вы увидите, что указатель указывает на символ 'd' для входной строки с 'd' (то же самое относится и к 'a' и 'f')

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

3 голосов
/ 02 июня 2011

Какой компилятор / библиотеки вы используете для компиляции этого кода?Предполагая, что вы находитесь в Visual Studio, такое поведение ожидается (цитирование текста из MSDN):

strtod ожидает, что nptr будет указывать на строку следующего вида:

[пробел] [знак] [цифры] [.digits] [{d |D |е |E} [подписать] цифры]

Вы можете найти полную документацию для strtod здесь

Другие реализации библиотеки, вероятно, будут поддерживать что-то подобное.Однако на странице руководства для strtod найден здесь не указано, что d распознается как действительный символ для цели преобразования.В таком случае это приведет к остановке синтаксического анализа входной строки и анализу будут выполняться только символы до тех пор, пока эта точка не будет преобразована (то же самое происходит со строками, содержащими a и f).

Возможновам следует взглянуть на документацию по вашей реализации библиотеки и выяснить формат, который strtod сможет проанализировать для вашего конкретного случая.

1 голос
/ 02 июня 2011

Использование D вместо E - это способ Fortran для выделения double данных (вместо float).Вы, вероятно, используете стандартную библиотеку, которая принимает ее как расширение.

0 голосов
/ 02 июня 2011

Какая платформа и компилятор? И в Linux, и в Mac OS X я получаю такой результат:

::: [1.000000] [10.000000] [1.000000] [1.000000]

, что означает только e работал. Обратите внимание, что вы не проверяли на ошибки ...

...