0

次の文字列で atoi() を呼び出そうとしています: "54" および "54df4"。最初の入力では 54 という正しい結果が得られましたが、2 番目の文字列の呼び出しでも 54 という結果が得られました。関数は可能な限り文字列を 10 進数に変換していると思います。代わりに、まったく変換しないでください。これはなぜですか?以下は私のコードです:

cout << "Wrong: " << atoi("54df4") << endl;

ありがとう、ラケッシュ。

4

4 に答える 4

4

それが動作するよう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");
}
于 2013-03-06T13:41:53.920 に答える
2

atoiのドキュメントより

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

于 2013-03-06T13:38:40.227 に答える
1

atoiそう定義されているからです。たとえば、このmanページを取り上げます。

このatoi()関数は、 が指す文字列の最初の部分を に変換しnptrますint

またはC標準では:

C11 (n1570)、§ 7.22.1.2 atoiatol、およびatoll関数

、、および関数atoiは、nptr が指す文字列の最初の部分をそれぞれ、、および表現に変換します。atolatollintlong intlong long int

  • 変換する文字列に対してより複雑な操作を実行する場合は、代わりに使用します (たとえば、この回答strtolを参照してください)。
  • これらの仕様に同意しない場合は、独自の関数を作成してください。
于 2013-03-06T13:37:56.087 に答える
1

以下からいくぶん恣意的に見つけた man page for atoi....

http://linux.die.net/man/3/atoi

* atoi() 関数は、nptr が指す文字列の最初の部分を int に変換します。*

つまり、関数は定義どおりに機能しています。

于 2013-03-06T13:38:57.443 に答える