3

全て、

atol や atoi など、文字列が数値かどうかをチェックして変換する関数... atol の説明で c/c++ リファレンスをチェックインしたところ、文字列に数値がない場合はこのように記述されていました。

変換は実行されず、ゼロが返されます。

明らかに、渡された文字列が"0"そうである場合、これは曖昧である可能性があり、atol は前のケースと同じようにゼロを返します。

関数のシグネチャは int atoi() または long atol() であるため、戻り値は int または long である可能性があるため、戻り値はすべての場合で実際の int の戻り値と一致します。(atoi が負を返しても意味します)数値以外の文字列の値 この戻り値は、この値自体の文字列の変換と一致します) あいまいさが持続します

文字列が数値であるか、この関数を使用していないかどうかをチェックするのは安全ではありませんか? この場合の良い解決策は何ですか?

4

5 に答える 5

4

strtolまたはを使用するstrtollと、最初の無効な文字の位置が返されるため、変換が行われたかどうかがわかります。

于 2012-12-10T09:19:55.933 に答える
2

グループの関数にato...は、実質的に意味のある実用的な用途はありません。この変換を実行したり、入力文字列の形式が正しいかどうかを確認するには、strto...グループの関数を使用します。

変換された実際の値を返すことに加えて、strto...groupの関数は、入力文字列のどの文字が変換プロセスを停止させたかを示します。さらに、これらの関数は、オーバーフローの場合にグローバルerrno変数をに設定します。ERANGE呼び出し後にこの追加データを分析することで、変換が成功したかどうかを正確に知ることができます。

一方、ato...関数は意味のある診断機能を提供しません。また、オーバーフロー時に未定義の動作をトリガーします。

于 2012-12-10T09:22:53.963 に答える
2
(int)strtol()

変換を確認するために char * を渡すことができます

于 2012-12-10T09:19:52.623 に答える
1

c ++ 11を使用している場合は、<string>にあるstoi()を使用できます。変換が失敗した場合は例外がスローされます:http: //en.cppreference.com/w/cpp/string/basic_string/stol

于 2012-12-10T09:25:22.210 に答える
0

安全でも危険でもありません。それは単にそれをしません。それが「安全」かどうかは、入力を検証するためにすでに行ったことによって異なります。テキストから値への変換の一部として検証が必要な場合は、strtolより多くの情報が得られます。

于 2012-12-10T14:24:34.760 に答える