- 2012-2-15
- Visual C++
ずいぶん前の記事
MSDNでatoiの戻り値をみるとこう書いてある。
「これらの関数は、入力された文字を数字として解釈し、
生成した double、int、__int64、または long 整数値を返します。
入力がその型の値に変換できないときは、戻り値として、0 (atoi 関数と _atoi64 関数)、
0L (atol 関数)、または 0.0 (atof 関数) を返します。
オーバーフローが発生したときの戻り値は未定義です。」
これには注意が必要で、0が失敗で、0以外が成功というわけではない。
以下のソースを実行してみる。
CString str;
char* ch;
int i;
str = "12A222";
ch = "1234RRR";
i = atoi(str);
i = atoi(ch);
を実行すると、 文字があるからエラーなのかな~なんて思いきや、
最初の結果は、「12」、次の結果は「1234」と返ってくる。
変換された文字長と変換前の文字長をみてあげないと、変換失敗なのか
成功なのかわからないわけである。。。
うーんよくある。。
数字だけチェックしたいなら、こんな方法も・・・
CString strNumber = "123asd123";
for( int i = 0; i < strNumber.GetLength(); i++)
{
if( isdigit(strNumber.GetAt(i)) == 0 )
{
//数値以外だった。。
break;
}
}
結局上記だと"-123"とかはダメなんだよねぇ・・。あー面倒・・VBは楽だったなぁ。。