Как сказали комментаторы, используйте strtol()
, а не atoi()
.
. Проблема с strtol()
состоит в том, что она выдаст ошибку ERANGE
(согласно спецификации), когда преобразованное число не будет вписываться в длинный тип. Поэтому, если вы попросите его преобразовать " 1"
, это даст 1
. Если вы попросите его преобразовать "apple"
, он вернет 0
и установит endptr
для указания ошибки.
Очевидно, вам необходимо решить, будет ли " 12"
допустимый ввод или нет - strtol()
с удовольствием пропустит начальный пробел.
EDIT : функция обновлена, чтобы лучше обрабатывать ошибки с помощью endptr
.
// Convert the given <text> string to a decimal long, in <value>
// Allow a string of digits, or white space then digits
// returns 1 for OK, or 0 otherwise
int parseLong( const char *text, long *value )
{
int rc = 0; // fail
char *endptr; // used to determine failure
if ( text && value )
{
errno = 0; // Clear any errors
*value = strtol( text, &endptr, 10 ); // Do the conversion
// Check that conversion was performed, and
// that the value fits in a long
if ( endptr != text && errno != ERANGE )
{
rc = 1; // success
}
}
return rc;
}