Понимание функции atoi () - PullRequest
       0

Понимание функции atoi ()

7 голосов
/ 31 октября 2011

Я программист на питоне, изучающий C из книги K & R. Это будет казаться ужасно тривиальным вопросом, но, тем не менее, я в тупике. Ниже приведен фрагмент кода из книги K & R (RIP Ritchie!), В которой реализована функция atoi ().

atoi(s) /*convert s to integer */
char s[];
{
    int i, n, sign;
    for (i=0; s[i]==' '||s[i] == '\n' || s[i] == '\t'; i++)
    ;   /* skip whitespace */
    sign = 1;
    if (s[i] == '+' || s[i] = '-')  /* sign */
        sign = (s[i++] == '+') ? 1 : -1;
    for (n=0; s[i] >= '0' && s[i] <= '9'; i++)
        n = 10 * n + s[i] - '0';
    return (sign * n);
}

Мои вопросы:

1) Служит ли первый цикл for для какой-либо цели, кроме подсчета количества допустимых символов?
2) Если (1) верно, первый цикл устанавливает значение 'i' равным количеству допустимых символов - как работает второй цикл for без сброса i в 0?

Скажем, например, я ввожу '2992' в качестве входа в функцию. Первый цикл for устанавливает i в 3, так как же работает остальная часть функции? Возможно, у меня все основы испорчены, но любая помощь будет очень признательна. Спасибо, Крейг

Ответы [ 6 ]

10 голосов
/ 31 октября 2011
int atoi(char* str)
{
    if(!str)
        printf("Enter valid string");

    int number = 0;
    char* p = str;

    while((*p >= '0') && (*p <= '9'))
    {
        number = number * 10 + (*p - '0');
        p++;
    } 
    return number;
}

Вот вся идея ATOI.

1) Вы устанавливаете указатель на начало массива char

2) И затем внутри цикла цикла вы проходите через каждыйумножьте на 10 и добавьте символ, вычитая на 0.

И если вы попробуете с 2992. Число будет также 2992.

4 голосов
/ 31 октября 2011

Первый цикл выполняет то, что говорит комментарий: он пропускает пробел.

После него i - это индекс первого непробельного символа, что и нужно для продолжения.

1 голос
/ 31 октября 2011

Первый цикл for переводит i к первому непробельному символу.

Условие между циклами запоминает знак, если таковой имеется.

Затем последний цикл for выполняет фактическое преобразование.

Наконец, знак применяется, и результат возвращается.

1 голос
/ 31 октября 2011

Комментарий дает ответ: первый цикл должен пропустить пробел .Для 2992, i останется 0.

1 голос
/ 31 октября 2011

Нет, первый цикл пропускает пробелы, как говорится в комментарии.

0 голосов
/ 26 сентября 2013

1) ни один первый цикл for не учитывает количество символов, но подсчитывает первую позицию числа, если только начальные символы являются пробелами, т. Е. Для этого «-2992» я буду 1, а для «2992» я буду 0 , 2) sign = (s[i++] == '+') ? 1 : -1; этот оператор проверяет, является ли i-й символ символом, и увеличивает счетчик на 1 [i ++], а для следующего цикла for это i - первая начальная цифра в строке. если я сделаю 0, то для первого условного ввода ваш устав проверки будет пробелом!

edit1: первый ввод "space space-2992"

...