Возвращаемое значение Атои

У меня вопрос относительно atoi. Я пытаюсь использовать atoi, чтобы проверить, могу ли я преобразовать символ в число, однако, если мое число равно 0, как мне обойти это? Я понимаю, что atoi возвращает 0 в случае сбоя, но также возвращает значение числа, если он работает, и в этом случае 0 подпадает под обе категории.

Если бы вместо этого я использовал strtol, есть ли способ проверить, является ли символ в массиве >= 0 или вообще не существует/не существует.

Например, если мой динамический массив состоит из {1 40 500}, и я пытаюсь выполнить strtol в позиции 8 (только за пределами границ), я хотел бы, чтобы он возвращал NULL или какой-либо признак того, что atoi/strtol не удалось


person FreeStyle4    schedule 01.03.2016    source источник
comment
С помощью strtol вы можете использовать endptr, чтобы определить, удалось ли преобразование.   -  person user3386109    schedule 01.03.2016
comment
Вы имеете в виду 1 40 500?   -  person nalzok    schedule 01.03.2016
comment
См. Правильный способ использования strtol(), чтобы узнать, как правильно использовать strtol(). Это не тривиально. Информация доступна; просто сложно правильно выполнить все условия.   -  person Jonathan Leffler    schedule 01.03.2016
comment
atoi() и strtol() используются для преобразования массивов символов в целочисленные типы.   -  person nalzok    schedule 01.03.2016


Ответы (3)


Вместо этого вы можете использовать sscanf для считывания целого числа, таким образом, просто проверьте возвращаемое значение sscanf, чтобы увидеть, нашел ли он целое число или нет.

char a[] = "12";
char b[] = "abc";
int n = 0;

assert(sscanf(a, "%d", &n ) == 1);
assert(sscanf(b, "%d", &n ) == 0);
person AndersK    schedule 01.03.2016

если мой номер 0, как мне это обойти?

Во-первых, не используя atoi(). Вместо этого используйте член семейства функций strto*().

person alk    schedule 01.03.2016

By

динамический массив состоял из {1 40 500}

Вы имеете в виду C-строку "1 40 500"? Если это так, то вызов strtol по нулевому завершению (позиция 8) вернет во втором параметре тот же переданный ему ptr:

char *s = "1 40 500";
char *ptr;
strtol(&s[8], &ptr, 10);
if (&s[8] == ptr) {
  // code executed if strtol was called at the null termination
}
person Kyle    schedule 14.12.2016