2016-09-02 34 views
0

atoiコマンドで非常に基本的なCコードを書いて実行しました。私はこのatoiコマンドがなぜ動作するのかを教えてください。

void 
main 
(void) 
{ 
    int length; 

    length = atoi("Content: 111"); 
    printf("atoi(\"Content: 111\") = %d\n",length); 

    length = atoi("Content: 111" + 10); 
    printf("atoi(\"Content: 111\" + 10) = %d\n",length); 

    length = atoi("Content: 1" + 6); 
    printf("atoi(\"Content: 1\" + 6) = %d\n",length); 

    length = atoi("Content: 111" + 12); 
    printf("atoi(\"Content: 111\" + 12) = %d\n",length); 

    length = atoi("Content-aaaaaa:   111" + 20); 
    printf("atoi(\"Content-aaaaaa:   111\" + 20) = %d\n",length); 

    printf("\"aaa\"+7 = %s","aaa"+7); 
} 

出力は以下のようになります。

atoi("Content: 111") = 0 
atoi("Content: 111" + 10) = 111 
atoi("Content: 1" + 6) = 0 
atoi("Content: 111" + 12) = 0 
atoi("Content-aaaaaa:   111" + 20) = 111 
"aaa"+7 = ; 

これは可能ですか?なぜatoiが+ intで書いた文字の量をスキップするのですか? 私はエラーではありませんか? と、なぜ最後のprintfも働いたのですか?

私は、マニュアルを読み、この動作については何もありません:

int型ATOI(定数するchar * strが)。 文字列を整数に変換する 内容を整数型として解釈するC文字列strを解析し、int型の値として返されます。

この関数は、空白以外の最初の文字が見つかるまで、必要なだけ多くの空白文字(isspaceと同じ)を破棄します。次に、この文字から始めて、オプションの最初のプラス記号またはマイナス記号の後にできるだけ多くの10進数を取り、それらを数値として解釈します。

文字列には、整数を構成する文字の後に追加の文字を含めることができます。この文字は無視され、この関数の動作には影響しません。

strの非空白文字の最初のシーケンスが有効な整数でない場合、またはstrが空であるか空白文字のみを含むためにそのようなシーケンスが存在しない場合、変換は実行されず、ゼロが返されます。

+3

これは 'atoi'とは関係ありませんが、ポインタの算術演算ではなく –

答えて

1

関数呼び出しの引数として使用される例示的な文

length = atoi("Content: 111" + 10); 

この式

"Content: 111" + 10 

ための検討は、いわゆるポインタ演算を含んでいます。

タイプ​​の文字列リテラル"Content: 111"は、暗黙的に、タイプchar *を取得する最初の文字へのポインタに変換されます。次に、文字列リテラルの先頭からのオフセットを生成するポインタに整数値10が追加されます。

したがって式文字列リテラルの顕著な位置に

"Content: 111" + 10 
     ^

ポイント。

あなたは機能、次のよう

char *tmp = "Content: 111"; 
tmp = tmp + 10; 
puts(tmp); // just for testing 
length = atoi(tmp); 

を呼び出す機能を画像化することができます数字または記号が発生し、数111を抽出されるまで、主要な空白文字をスキップします。それはすべてです。

+0

ありがとう!素晴らしい説明! –

+0

@NinjaYo。いいえ、まったく。どういたしまして。:) –

5

atoiは、先頭のスペース文字も受け入れます。

残りは単純なポインタ演算です。

  • "Content: 111" + 10を実行すると、" 111"がatoiに渡されて動作します。
  • あなたが"Content: 1" + 6を行うと、あなたがatoi"t: 1を渡しているし、それが0
  • "aaa"+7を返します。それをしない:未定義の動作を。
関連する問題