Почему функция atof() не возвращает 0, когда я передаю ей строку с недопустимыми символами после числа?
Мне нужно преобразовать строку в число с плавающей точкой. Если строка не является числом, я хочу вернуть 0.
Я пытался проверить, если atof()
Функция будет работать для этого, используя следующий код:
printf("%f", atof("1a"));
Из моего понимания atof значение, возвращаемое, когда atof не может преобразовать, равно 0, и все же эта строка печатает 1.0
,
Почему это происходит? Из документации я понял, что atof должен возвращать 0, когда входные данные не являются числом.
3 ответа
Из док. Акцент мой
Функция сначала отбрасывает столько пробельных символов (как в isspace), сколько необходимо, пока не будет найден первый непробельный символ. Затем, начиная с этого символа, принимает максимально возможное количество символов, допустимых после синтаксиса, напоминающего синтаксис литералов с плавающей запятой (см. Ниже), и интерпретирует их как числовое значение. Остальная часть строки после последнего действительного символа игнорируется и не влияет на поведение этой функции.
пока эта строка печатает 1.0.
printf("%f", atof("1a"));
работал потому что atof
может разобрать хотя бы одно число, т.е. 1
в этом случае.
Но:
char a[]="a1";
printf("%f\n",atof(a));
должен был дать вам возвращаемое значение 0,0, как вы ожидали.
Я видел, что вы проверили некоторую документацию, но вы, должно быть, пропустили выделенную часть - важно убедиться, что вы внимательно прочитали документацию: http://www.cplusplus.com/reference/cstdlib/atof/
Функция сначала отбрасывает столько пробельных символов (как в isspace), сколько необходимо, пока не будет найден первый непробельный символ. Затем, начиная с этого символа, принимает максимально возможное количество символов, допустимых после синтаксиса, напоминающего синтаксис литералов с плавающей запятой (см. Ниже), и интерпретирует их как числовое значение. Остальная часть строки после последнего действительного символа игнорируется и не влияет на поведение этой функции.
Таким образом, функция ведет себя именно так, как и должна - a
персонаж в "1a"
игнорируется.