2

次のように使用して、16進形式の文字列から割り当てるdouble fooことができるとします。sscanf

sscanf("0XD", "%lg", &foo)

istringstreamしかし、私は同じように振る舞うことができないようです。これらはすべて に 0 を書き込むだけfooです:

  1. istringstream("0XD") >> foo
  2. istringstream("0XD") >> hex >> foo
  3. istringstream("D") >> hex >> foo

これは、抽出演算子が次のことを行う必要があることをここで読んだときに特に懸念されます。double istream

char前の手順で取得した値が、std::scanf指定された変換指定子によって解析される入力フィールドで許可されているかどうかがチェックされます。

から 16 進数を読み取れないのはなぜistreamですか? テストに役立つ場合は、ここにテストコードをいくつか書きました。

4

2 に答える 2

2

あなたが探しているのはhexfloat修飾子です。修飾子はhex整数用です。

準拠したコンパイラでは、これで問題が解決します。

#include <cstdio>
#include <iomanip>
#include <iostream>
#include <sstream>
using namespace std;

int main() {
    double foo;

    sscanf("0xd", "%lg", &foo);
    cout << foo << endl;

    istringstream("0xd") >> hexfloat >> foo;
    cout << foo << endl;

    istringstream("d") >> hexfloat >> foo;
   cout << foo << endl; 
}

Visual Studio 2015を使用すると、次のものが生成されます。

13
13
13

libc++を使用すると、以下が生成されます。

13
13
0

だから合法性はわからないistringstream("d") >> hexfloat >> foo

于 2016-05-26T14:42:05.287 に答える