Не используйте atoi и atof, так как эти функции возвращают 0 при сбое. В прошлый раз, когда я проверял 0, является допустимым целым числом и числом с плавающей запятой, поэтому нет смысла определять тип.
использует функции strto {l, ul, ull, ll, d}, так как они устанавливают errno при сбое, а также сообщает, где закончились преобразованные данные.
strtoul: http://www.opengroup.org/onlinepubs/007908799/xsh/strtoul.html
В этом примере предполагается, что строка содержит одно значение для преобразования.
#include <errno.h>
char* to_convert = "some string";
char* p = to_convert;
errno = 0;
unsigned long val = strtoul(to_convert, &p, 10);
if (errno != 0)
// conversion failed (EINVAL, ERANGE)
if (to_convert == p)
// conversion failed (no characters consumed)
if (*p != 0)
// conversion failed (trailing data)
Спасибо Джонатану Леффлеру за то, что он указал, что я забыл сначала установить для errno значение 0.