atof、atoi、_atoi64、atol の注意点

  • デル株式会社
  • ずいぶん前の記事

     

    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は楽だったなぁ。。

    関連記事

    ページ上部へ戻る