12

からへのatoi変換を取得するために関数を使用しようとしています。問題は、整数と文字列値の両方を含む文字列配列があることです。stringint

私が読んだことから、エラーコードを取得するには、関数は 0 を返す必要があります:

string s = "ssss";
int i = atoi(s.c_str())
if (i == 0)
    cout<<"error"<<endl;
end;

文字列値が の場合、どうすればよい0ですか?

もう 1 つの問題は、次の文字列にありますstring s = "001_01_01_041_00.png"atoi関数は値を返します1。返してはいけません0。なぜ戻るの1ですか?

4

4 に答える 4

19

そのためatoi、安全に使用できません。入力が無効であるかどうかを検出してプログラムに通知しません。

C++11 では、入力が何らかの方法で無効な場合に例外std:stoiがスローされるため、どちらが安全であるかが導入されました。他にも 2 つのバリアントがあります:と. 詳細については、オンライン ドキュメントを参照してください。std::stolstd:stoll

コードは次のようになります。

try {
     string s = "ssss";
     int  i = std::stoi(s); //don't call c_str() 
     //if (i == 0) no need to check!
     std::cout << i << endl;
}
catch(std::exception const & e)
{
     cout<<"error : " << e.what() <<endl;
}

のランタイム タイプは、スローの原因に応じてまたはのe いずれかになることに注意してください。異なる方法で処理したい場合は、2 つのブロックを記述できます。std::invalid_argumentstd::out_of_rangecatch

于 2012-11-20T10:09:23.367 に答える
2

std::stoi と boost::lexical_cast の C++ API を推奨する適切な回答が既にあります。

atoi() は C API であり、ゼロの解析が成功したことと失敗を区別できないため、C でも壊れています。C を書いている場合、エラーが気になる場合は代わりに strtol() とその仲間を使用してください。エラーは ERRNO でアウトオブバンドで報告されるためです。

于 2012-11-20T10:45:34.430 に答える
1

の数値001_は 1 であるのに、なぜ 0 を返す必要があるのでしょうか? 1文字だけ処理したい場合は、 and を使用isdigit(s[0])してs[0]-'0'ください。文字列に含まれる数字の量をより正確にエラー チェックしたい場合は、 を使用しますstrtol

于 2012-11-20T10:09:09.817 に答える
0

atoi はちょっと古いです... ブースト lib "レキシカル キャスト" には、より良い代替品があります。

char * str = boost::lexical_cast<std::string>(int_value);

また

int int_value = boost::lexical_cast<int>(string_value);
于 2012-11-20T10:26:16.877 に答える