-2

一部のサイトでatoi()の説明を読んでみましたが、答えが得られませんでした。何になりますか

int i = atoi("000000000000000000003");  
printf("%d", i);  

結果?3になりますか、それともエラー(atoi()の場合は0)を返しますか?
現在、利用できるコンパイル手段がないため、テストすることはできません。

編集:引数として「000000000000000000003」の代わりに誤って000000000000000000003がありました。

Edit2:おかげで、テストに関する部分はもう関係ありません。

4

3 に答える 3

2

全く使用しないでくださいatoi()。入力をチェックしないので安全ではありません。

strtol()代わりに使用することを検討してください。

あなたの質問に関して:それはうまくいきません。パラメータはconstchar*である必要があります。この例では、intです。(編集後、3が返されます)

于 2013-01-15T03:13:32.577 に答える
2

C90標準を参照するPOSIXによると、10進数atoiのラッパーでstrtolあり、その関数は

baseの値が2〜36の場合、サブジェクトシーケンスの予想される形式は、基数で指定された基数を持つ整数を表す文字と数字のシーケンスであり、オプションで「+」または「-」記号が前に付きます。…</p>

サブジェクトシーケンスは、入力文字列の最長の初期サブシーケンスとして定義され、予期された形式の最初の非空白文字から始まります。入力文字列が空であるか、完全に空白文字で構成されている場合、または最初の非空白文字が記号または許可されている文字または数字以外の場合、サブジェクトシーケンスには文字を含めないでください。

したがって、ゼロはそれを混乱させることはありません。3を返します。

于 2013-01-15T03:25:19.087 に答える
0

この参照によると:

この関数は、最初の非空白文字が見つかるまで、必要な数の空白文字(isspaceの場合と同様)を最初に破棄します。

あなたの例では、最初に見つかった文字は非空白(0!=空白文字)なので..

この文字から開始して、オプションの最初のプラス記号またはマイナス記号の後にできるだけ多くの10進数を取り、それらを数値として解釈します。

つまり、関数は、ベースが10に基づく数字である限り、文字を読み取ります。ただし、そうでない文字が1つ見つかるまで、たとえば、a(またはletterまたはnullで終了する文字\0です。それで...

その内容を整数として解釈し、int値として返されます。

したがって、例は次のように なりint i=000000000000000000003; ます。この値を指定すると、問題と同じようにprintf("%d", i)マシンが出力します。3

于 2013-01-15T03:25:25.307 に答える