Как описано в @cnicutar и @ouah, atoi
не может отличить действительный 0 от недопустимой строки, что делает семейство strtol
лучшими вариантами.
Но Почему? и Как? Сначала поймите, что и atoi
, и strtol
преобразуют только начальный набор чисел в строке в числовые значения. Любые завершающие нечисловые символы просто игнорируются. strtol
можно использовать для проверки недопустимых строк, поскольку помимо числового значения он также возвращает указатель на конец числовой части строки. Таким образом, если этот указатель end
по-прежнему относится к началу исходной строки, вы можете сказать, что произошла ошибка и символы из строки не были преобразованы.
Как видно из примера кода, есть еще несколько тонкостей:
long lnum;
int num;
char *end;
errno = 0;
lnum = strtol(in_str, &end, 10); //10 specifies base-10
if (end == in_str) //if no characters were converted these pointers are equal
fprintf(stderr, "ERROR: can't convert string to number\n");
//If sizeof(int) == sizeof(long), we have to explicitly check for overflows
if ((lnum == LONG_MAX || lnum == LONG_MIN) && errno == ERANGE)
fprintf(stderr, "ERROR: number out of range for LONG\n");
//Because strtol produces a long, check for overflow
if ( (lnum > INT_MAX) || (lnum < INT_MIN) )
fprintf(stderr, "ERROR: number out of range for INT\n");
//Finally convert the result to a plain int (if that's what you want)
num = (int) lnum;
Примечание. Если вы уверены, что входная строка будет в допустимом диапазоне int, вы можете исключить lnum
и просто напрямую привести strtol return: num = (int) strtolen(in_str, &end, 10);
person
Bryan P
schedule
31.08.2013
atoi
, он вообще не обнаруживает ошибок. Не доверяйте этому сайту. - person Fred Foo   schedule 05.03.2013atoi()
, когда правильное значение выходит за пределы допустимого диапазона. Стандарт C ++ 11 говорит еще меньше (он перечисляетatoi
в двух таблицах, и все!). Заявления с сайта cplusplus.com, по сути, являются выдумкой желаемого за действительное и / или распространенными реализациями, не гарантированными никакими стандартами. - person Jonathan Leffler   schedule 31.08.2013