From the man page on double atof(const char *nptr):
The atof() function converts the initial portion of the string pointed to by nptr to double. The behavior is the same as
strtod(nptr, NULL);
except that atof() does not detect errors.
Why can't it detect errors? Well, because that second argument of double strtod(const char *nptr, char **endptr) is used to point to the last character that couldn't be converted, so you can handle the situation accordingly. If the string has been successfully converted, endptr will point to \0. With atof, that's set to NULL, so there's no error handling.
An example of error handling with strtod:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char *str = "1234.56";
char *err_ptr;
double d = strtod(str, &err_ptr);
if (*err_ptr == '\0')
printf("%lf\n", d);
else
puts("`str' is not a full number!");
return 0;
}