atoi関数での10倍していく処理

K&R本 2.7

atoi関数のサンプルがあった

int atoi(char s[]){
    int i, n;
    n = 0;
    for(i = 0; s[i] >= '\0' && s[i] <= '9'; ++i ) {
        n = 10 * n + (s[i] - '0');
    }
}

このnの一行が素晴らしい。

僕がatoi関数を自作した時はこうなっていた。

while(*str != '\0'){
    // 0〜9以外の文字列ならそこで終了
    if ( *str < 48 || *str > 57 ) {
        break;
    }
    num += *str - 48;
    num *= 10;
    str++;
}

num /= 10;
atoi関数を自作してみる - (void*)Pないと

一部抜粋。

このようにループ内では基本的に10倍していき、ループを抜けた時点で10で割るという面倒くさいことをしていた。

サンプルでは「10 * n」とすることで一回目の10倍を無視している(n = 0なので)

ラーニングしました。