2011-10-31 26 views
6

私はPythonプログラマーで、K & R本からC言語を学んでいます。これは非常に些細な質問のように見えますが、それにもかかわらず私は困惑しています。 atoi()関数を実装している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)ループ」の初が有効characatersの数をカウントする以外に任意の目的を果たしていますか?
2)(1)が真の場合、最初のループは 'i'の値を有効な文字の数に設定します。

たとえば、関数の入力として「2992」と入力します。最初のforループは、iを3に設定するので、残りの関数はどのように機能しますか? 私の基本はすべて乱れているかもしれませんが、どんな助けでも本当に感謝しています。ありがとう、-Creig

+1

私はCが_that_ terribleであることに気づいていませんでした。 –

+0

私は、コードを理解する最も良い方法はデバッガ(例えばgdb)でコードを実行し、段階的に進めることだと思います。また、内部のコードとコメントを読むことで助けになるかもしれません。 – eyalm

+0

@PatrickB .:これは非常に古いものです。C. Modern Cはまったく同じです:)(関数のシグネチャがはるかに明瞭な 'int atoi(con​​st char * s)'を除いて) – Mat

答えて

10
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であろう。

+0

OPがK&Rにはるか遠ざかっている場合、C89では、コードの途中で宣言を記述できないことを指摘します。http://stackoverflow.com/questions/288441/variable-declaration-placement- in-c – HostileFork

4

最初のループは、コメントが言う通り、空白をスキップします。

その後、iは、最初の空白以外の文字のインデックスです。これは、処理が必要なものです。

1

いいえ、最初のループはコメントのように空白をスキップします。

1

コメントは答えを提供します:最初のループはに、空白をスキップです。 2992については、i0のままです。

1

最初のforループは、最初の非空白文字を指すように進みます。

ループ間の条件付きで、記号があればそれに注意します。

最後のforループが実際の変換を行います。

最後に符号が適用され、結果が返されます。

0

1)最初のforループは文字の数を数えませんが、開始文字だけが空白の場合、つまり "-2992"の場合は1になり、 "2992"の場合は1になります。 0 2)sign = (s[i++] == '+') ? 1 : -1;この文は、i番目のcharが符号であるかどうかをチェックし、カウンタを1 [i ++]増加させ、次のforループに対してこれが文字列の最初の桁であることを確認します。最初の条件付き入力が0の場合、チェックチャーターはスペースになります!

edit1:最初の入力は "space space-2992"