次の文字列で atoi() を呼び出そうとしています: "54" および "54df4"。最初の入力では 54 という正しい結果が得られましたが、2 番目の文字列の呼び出しでも 54 という結果が得られました。関数は可能な限り文字列を 10 進数に変換していると思います。代わりに、まったく変換しないでください。これはなぜですか?以下は私のコードです:
cout << "Wrong: " << atoi("54df4") << endl;
ありがとう、ラケッシュ。
次の文字列で atoi() を呼び出そうとしています: "54" および "54df4"。最初の入力では 54 という正しい結果が得られましたが、2 番目の文字列の呼び出しでも 54 という結果が得られました。関数は可能な限り文字列を 10 進数に変換していると思います。代わりに、まったく変換しないでください。これはなぜですか?以下は私のコードです:
cout << "Wrong: " << atoi("54df4") << endl;
ありがとう、ラケッシュ。
それが動作するようatoi
に指定されている方法です。数字以外の文字を含む文字列を変換したくない場合は、文字列を事前にスキャンするかstrtol
、最初の数字以外の文字の位置を返す次のような関数を使用する必要があります。
cons char *number = "54df4";
char *endp = NULL;
int value = strtol(number, &endp, 10);
if (endp != NULL && endp < (number + strlen(number)))
{
printf("Stopped scanning in middle of string, it contains non-digit characters\n");
}
atoiのドキュメントより
文字列には、整数を形成する文字の後に追加の文字を含めることができます。これらの文字は無視され、この関数の動作には影響しません。
atoi
そう定義されているからです。たとえば、このmanページを取り上げます。
この
atoi()
関数は、 が指す文字列の最初の部分を に変換しnptr
ますint
。
またはC標準では:
C11 (n1570)、§ 7.22.1.2
atoi
、atol
、およびatoll
関数、、および関数
atoi
は、nptr が指す文字列の最初の部分をそれぞれ、、および表現に変換します。atol
atoll
int
long int
long long int
strtol
を参照してください)。以下からいくぶん恣意的に見つけた man page for atoi....
http://linux.die.net/man/3/atoi
* atoi() 関数は、nptr が指す文字列の最初の部分を int に変換します。*
つまり、関数は定義どおりに機能しています。