Почему функция 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" игнорируется.

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