C++11:当前导字符为 alpha (abcdef) 时如何从 stringstream 解析十六进制字符串

C++11: How to parse a hex string from stringstream when leading character is alpha (abcdef)

我正在尝试根据 https://en.cppreference.com/w/cpp/io/manip/hex 中的示例从 std::stringstream 中读取一个十六进制值。当字符串的前导字符是数字字符 [0-9] 时,一切正常,但是当前导字符是字母字符 [a-f,A-F] 时,从流中获取值会消耗字符但不会分配值到整数。是否需要设置一个标志或其他东西来告诉 stringstream 或 std::hex 这实际上是一个有效的十六进制值并且应该这样解释?

我可能最终会从流中读取一个字符串并使用 std::stoi,但想知道为什么直接从字符串流中解析不起作用或者是否有办法让它起作用。

示例代码:

#include <iostream>
#include <sstream>
#include <string>
int main()
{
    int anint = 0;
    std::stringstream ss;
    ss.str("1234abcd");
    ss >> std::hex >> anint;
    printf("anint = %x\n", anint);

    anint = 0;
    ss.str("a234abcd");
    ss >> std::hex >> anint;
    printf("anint = %x\n", anint);

    return 0;
}

输出:

anint = 1234abcd
anint = 0

您代码中的(主要)问题是您在第一次读取字符串流后没有清除 EOF 标志!此外,如果您的系统使用 32 位 int 类型,值 a234abcd 将溢出,您将(可能)得到一个 0x7FFFFFFF 的值(即 INT_MAX).

下面的代码给出了(我认为)你想要的:

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    int anint = 0;
    std::stringstream ss;
    ss.str("1234abcd");
    ss >> std::hex >> anint;
    printf("anint = %x\n", anint);

    ss.clear(); // Clear EOF flag!
    anint = 0;
//  ss.str("a234abcd");// Will overflow 32-bit int!
    ss.str("a234abc"); // Works 'properly'
    ss >> std::hex >> anint;
    printf("anint = %x\n", anint);

    return 0;
}

随时要求进一步澄清and/or解释。

我像@Adrian Mole 提到的那样编辑了代码,现在我看到了更有意义的结果。结果我只需要读取一个无符号整数。

编辑代码

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    int anint1 = 0;
    std::stringstream ss1;
    ss1.str("1234abcd");
    ss1 >> std::hex >> anint1;
    printf("anint = %x\n", anint1);

    int anint2 = 0;
    std::stringstream ss2;
    ss2.str("a234abcd");
    ss2 >> std::hex >> anint2;
    printf("anint = %x\n", anint2);

    unsigned int anunint = 0;
    std::stringstream ss3;
    ss3.str("a234abcd");
    ss3 >> std::hex >> anunint;
    printf("anunint = %x\n", anunint);

    return 0;
}

结果

anint = 1234abcd
anint = 7fffffff
anunint = a234abcd