2016-03-01 2 views
1

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

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

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

+2

С 'strtol', вы можете использовать' endptr' для определить, удалось ли преобразование. – user3386109

+1

Вы хотите сказать "1 40 500"? –

+2

См. [Правильный способ использования 'strtol()'] (https://stackoverflow.com/questions/14176123/correct-usage-of-strtol) для правильного использования 'strtol()'. Это не тривиально. Информация доступна; это просто сложно получить все условия. –

ответ

1

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

Не используйте atoi() на первом месте. Вместо этого используйте член семейства strto*().

2

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

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

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

По

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

Вы имеете в виду C-строку "1 40 500"? Если это так, то вызов strtol в нулевом прекращении (позиция 8) вернется в 2 параметре же 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 
} 
Смежные вопросы