11

scanf()とそのバリアントを使用する場合、フォーマット指定子%iはデータを16進数(接頭辞「0x」)、8進数(接頭辞「0」)、または10進数(接頭辞なし)として受け入れます。たとえば、文字列「0x10」、「020」 "、および" 16 "はすべて、10進値16の整数に変換されます。

std::istream::operator>>これはフォーマットされた入力 で実行できますか?

i / oマニピュレータのないプレーン>> iを使用すると、「0x10」はゼロに変換され(つまり、先頭の0は「x10」部分は処理されません)、「020」は20に変換されます。hexoctおよびdecマニピュレータはそれぞれ、、のよう%xに動作%o%dます。のように機能する一般的な整数入力マニピュレータを探してい%iます。

興味深いことに、hexマニピュレータは「0x10」と「10」の両方を受け入れ、どちらかを小数点以下16桁に変換します。

ご参考までに、私は式エバリュエーターを実装しています。C/ C ++プレフィックス規則を使用して、整数オペランドを16進数、8進数、または10進数にすることができます。を使用する現在の実装では、を使用sscanf()してこれを自動的に実行し%iます。数値形式を明示的に解析することなく、iostreamを使用するようにこれを変更できるかどうかについて興味があります。

4

2 に答える 2

11

のフォーマット フラグのベース フィールドは、basic_istream数値の解釈方法を指示します。decフィールドは、octおよび に設定できますhex。デフォルトでは、に設定されていdecます。それらのどれにも設定されていない場合、のフラグのbasic_istreamように動作します。scanf%i

// automatically detect the base, depending on prefix
std::cin.unsetf(std::ios_base::basefield);
于 2010-12-18T07:16:39.910 に答える