Почему ATOI возвращает 0 в этом коде?

Я только начинаю работать с C и пытаюсь изучить функцию ATOL. Может кто-нибудь сказать мне, почему он продолжает печатать 0? Я знаю, что это означает, что преобразование невозможно, но я не уверен, почему.

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    int i = atoi ("  bl149");
    printf("%d\n", i);  
    return 0;
}

person Lee Carlton    schedule 07.12.2012    source источник
comment
b не является десятичной цифрой.   -  person Mat    schedule 07.12.2012
comment
Посмотрите на этот - stackoverflow.com/questions/2729460/   -  person nightlytrails    schedule 07.12.2012
comment
Во-первых, C - это язык с учетом регистра. Так что это должно быть atoi, а не ATOI. Во-вторых, в теле вашего вопроса вы говорите о какой-то ATOL функции. Итак, это ATOI или ATOL?   -  person AnT    schedule 07.12.2012
comment
Несмотря на то, что atoi удобен для случаев, когда вы можете обрабатывать нечисловой ввод как 0 вместо ошибки, вам, вероятно, также следует изучить strtol, в большинстве случаев вам все равно придется его использовать.   -  person hyde    schedule 07.12.2012


Ответы (2)


atoi в основном преобразует строку с числом в целое число и все, что он будет преобразовывать, станет для него возвращаемым значением. ИЛИ, если быть более точным, функция atoi начинает проверку с начала строки. если он имеет цифру (только с начала), то он вернет это значение в виде целого числа. Пример ниже проясняет концепцию. Например

atoi("1234") 
--> it will convert string "1234" in to integer and return it 
         --> i.e. ouput is 1234
atoi("1234abcd") --> i.e. ouput is 1234
atoi("a1234abcd") --> i.e. ouput is 0   

В вашем случае, поскольку ваша строка начинается с b ("b1149"), поэтому она вернет 0

person facebook-100001358991487    schedule 07.12.2012
comment
о, хорошо, это имеет смысл - поэтому оно должно начинаться с целого числа. Я понимаю, что вы имеете в виду, я думал, что он может получить целое число из любой строки, независимо от символов. Спасибо! - person Lee Carlton; 07.12.2012

Что именно ты не понимаешь? " bl149" не является допустимым представлением числа. Итак, atoi возвращает 0, как всегда в случае ошибочного ввода. Вот и все, что нужно сделать.

Допустимое представление может начинаться с последовательности символов пробела, но за ним должны следовать необязательный +/- и последовательность десятичных цифр. За вашей последовательностью пробелов следует b. b не является десятичной цифрой.

Как вы ожидали, что это сработает? Что вы ожидали от этого atoi в этом случае?

person AnT    schedule 07.12.2012