strtol
не имеют только своего возвращаемого значения, чтобы сигнализировать об ошибке в преобразовании, у него также есть второй параметр (endptr
на моей man-странице); если вы передадите ему указатель на char *
, он сохранит там позицию первого символа, который он не смог преобразовать, или оставит его в покое, если ничего не удалось преобразовать. Таким образом, у вас есть следующие случаи:
char * endptr=NULL;
int out=strtol(yourstring, &endptr, 10);
if(endptr==NULL)
{
/* the whole string is garbage - no numbers extracted */
}
else if(*endptr==0)
{
/* the whole string was a number - yay! */
}
else
{
/* strtol extracted a number from the string, but stopped at some invalid character
that you can check by looking at the value of endptr */
}
Кроме того, вы также можете проверить значение, которое strtol
устанавливает errno
в случае проблем; EINVAL
используется, если ничего не может быть извлечено, другие значения можно увидеть на справочной странице strtol
.
Вы также можете использовать sscanf
и проверить его возвращаемое значение, чтобы быстро увидеть, может ли строка быть или не может быть преобразована в int
(или в то, что вы задали в строке формата).