C ++ 11: Как проанализировать шестнадцатеричную строку из потока строк, когда начальный символ - альфа (abcdef) - PullRequest
3 голосов
/ 23 апреля 2020

Я пытаюсь прочитать шестнадцатеричное значение из std :: stringstream на основе примера в https://en.cppreference.com/w/cpp/io/manip/hex. Все работает нормально, когда начальный символ строки является символом цифр c [0-9], но когда главный символ является буквенным символом [af, AF], получение значения из потока потребляет символы, но не присвоить значение целому числу Есть ли флаг или что-то, что нужно установить, чтобы указать 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

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

(Основная) проблема в вашем коде заключается в том, что вы не очищаете флаг 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;
}

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

1 голос
/ 23 апреля 2020

Я отредактировал код, как упомянуто @Adrian Mole, и теперь вижу результаты, которые имеют больше смысла. Оказывается, все, что мне нужно было прочитать без знака Int.

Отредактированный код

#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
...