1

文字列に含まれる数値のタイプ (整数または浮動小数点) を認識する必要があります。詳細には、数値を格納できる最小の型を理解する必要があります。正の値には符号なしの型が望ましいと思います。いくつかの例で説明する方が簡単かもしれません:

"123" -> unsigned char

"-21" -> char

"257" -> unsigned short

"-271"-> short

...

"....."  long long

"1.2"    float

"....."  double

"a"      NaN / error

strtoul、strtol、strtod の使用を検討しています。関数 (is_char()、is_float ()、... または num_type () など) または「スマート」(数学ベース?、... ) コーディングを開始する前に簡単に認識できるようにします。

ありがとう。

4

2 に答える 2

2

私はネガティブをテストすることから始めます。次に、小数点 (および指数表記) を探して、整数を使用するかどうかを決定します。

整数の場合、数値を最大の符号付きまたは符号なしの値 (おそらく int64) に変換してから、文字列に変換し直して、数値が同じになることをテストします (そうでなければ、int で表すことはできません)。

その時点で、ビットシフトまたはビットマスクを使用してサイズ要件を確認できます。事実上、(signed 型の場合) 絶対値を取得し、左側のゼロをチェックする必要があります。unsigned の基本的な考え方を示します...

unsigned long long val;
// ...

if( 0 != (val >> 32) )
    printf( "unsigned long long\n" );
else if( 0 != (val >> 48) ) 
    printf( "unsigned long\n" );
else if( 0 != (val >> 56) ) 
    printf( "unsigned short\n" );
else
    printf( "unsigned char\n" );

浮動小数点の場合、値を double として読み込み、FLT_MAX、DBL_MAX などに対してテストする必要がある場合があります...

于 2012-10-03T02:47:45.910 に答える
1

最初に小さいサイズを好み、次に符号なしを好むとおっしゃっています。しかし、あなたのタイプには一貫した「ペッキングオーダー」がありますか?つまり、S1技術的にタイプXまたはタイプYに変換してXを選択できる文字列がありますが、S2タイプXまたはタイプYに変換してもYを選択できる文字列はありますか?

C ++の用語に関しては、 「字句キャスト」に注意する必要があるかもしれません。関心のあるタイプのペッキング順序がある場合は、それらを順番に試して、 1つが機能するまでbad_lexical_cast例外をキャッチし続けることができます...:-/または独自の同等のものを記述します。

しかし、それを超えて、C ++のコンパイルされた性質は、ランタイムに到達して入力文字列を取得するまでに、のようなトリックautoは利用できないというものです。さらに、autoは「1」のタイプがであると判断するため、あなたの考えに従わないint

limits.hあなたはあなた自身の方法に取り組みたいのならあなたは指摘されてきました。しかし、そのための慣用的なC ++に興味がある場合は、私がこのテーマについて書いた記事をチェックしてください。

http://hostilefork.com/2009/03/31/modern_cpp_or_modern_art/

于 2012-10-03T02:50:52.503 に答える