strtod не устанавливает errno на неверный ввод - PullRequest
2 голосов
/ 21 марта 2012

g ++ (Ubuntu / Linaro 4.6.1-9ubuntu3) 4.6.1

#include <errno.h>
...
cin >> str;
errno = 0 ;
double d = strtod(str.c_str(), NULL);
if (errno) {
    cout << "Please, enter number.";
}

при неправильном вводе errno остаться 0.

Редакция: Следующая отлично работает:

char *err;
double d = strtod(str.c_str(), &err);
if (strlen(err)) {
    cout << "Please, enter number." << endl;
}

Ответы [ 2 ]

4 голосов
/ 21 марта 2012

Что за «неправильный ввод»?В соответствии с man-страницей, errno устанавливается только в том случае, если вход является числом, которое слишком велико или слишком мало для хранения в типе данных, но не , когда ввод вообще не является числом..

Если преобразование не выполняется, возвращается ноль и значение nptr сохраняется в местоположении, указанном в endptr.

Если правильное значение может вызвать переполнениеплюс или минус HUGE_VAL, HUGE_VALF или HUGE_VALL возвращаются (в зависимости от знака и типа возвращаемого значения), а ERANGE сохраняется в errno.Если правильное значение вызовет недостаточное значение, возвращается ноль и значение ERANGE сохраняется в errno.

1 голос
/ 21 марта 2012

Это все хорошо документировано:

If the correct value would cause overflow, plus or minus HUGE_VAL (HUGE_VALF, HUGE_VALL) is returned
(according to the sign of the value), and ERANGE is stored in errno.  If the correct value would
cause underflow, zero is returned and ERANGE is stored in errno.

If endptr is not NULL, a pointer to the character after the last character used in the conversion is
stored in the location referenced by endptr.

If no conversion is performed, zero is returned and the value of nptr is stored in the location
referenced by endptr.
...