Я не понимаю функцию Atoi в книге K & R C? - PullRequest
2 голосов
/ 20 января 2012
#include <stdio.h>
#include <string.h>

int main(void)
{
    char s[]= "9";
    printf("atoi = %d",atoi(s));
    system("pause");
    return 0;
}

int atoi(char s[])
{
    int i=0,n=0;

    for(i;s[i]>='0' && s[i]<='9';i++)
        n=10*n + (s[i]-'0');
    return n;

}

В приведенной выше программе он дал мне результат 9, согласно программе он должен вывести значение ascii для 9 и я не понимаю, что делает этот цикл for.

for(i;s[i]>='0' && s[i]<='9';i++)
n = 10*n + (s[i]-'0');

Ответы [ 3 ]

4 голосов
/ 20 января 2012

Давайте разберем это:

for (i;

Создает цикл for с переменной цикла i.Это не обязательно, но больше в стиле кодирования.

s[i] >= '0' && s[i] <= '9'

Это проверяет, чтобы убедиться, что символ с этим индексом находится внутри диапазона для десятичного знака (0 - 9), и если этонет, он выходит из цикла, затем возвращает число.

i++

После запуска цикла это увеличивает индекс, который вы проверяете в строке, на единицу.

n = 10 * n

Это добавляетдополнительная цифра в n, умноженная на 10, потому что вы знаете, что если у вас есть еще один символ в вашем числе, он должен быть умножен на десять (скажем, я начинаю синтаксический анализ 100, я читаю первые две строки и имею 10,есть еще один символ, поэтому я умножаю на десять, чтобы получить 100.

+ (s[i]-'0');

Это добавляет следующую цифру к 'n', результат, который определяется путем вычитания символа из текущего индекса на '0 ', который в диапазоне от 0 до 9 возвращает целое число для этого числа (если это вас смущает, взгляните на ASCII Chart .

Надеюсь, это помогло вампонять.

3 голосов
/ 20 января 2012

это преобразует строковое представление в число типа «329» в 329
Сначала требуется 3, затем 3 * 10 + 2 = 32
, затем 32 * 10 + 9 = 329

0 голосов
/ 20 января 2012
for(i;s[i]>='0' && s[i]<='9';i++) /* loop over just the digits, in L->R order */
    n = 10*n + (s[i]-'0');        /* Take value so far, "shift" a 10's place left, 
                                     and add in value of latest digit
                                     (diff between ASCII of digit & ASCII of zero) */
...