Генерация новой строки guid в c ++ без некоторых нулей

0

Я попытался использовать следующий код для генерации новой строки guid из 36 символов, но иногда она печатает только 35 или 34 символа. Полагаю, это связано с "нулями" в руководстве, но я не могу четко понять, почему. Есть ли способ исправить эту проблему?

#include <string>
#include <sstream>
#include <iostream>
#include <windows.h>
#include <iomanip>

int main()
{
    GUID guid;
    CoCreateGuid(&guid);
    std::ostringstream os;
    os.width(8);
    os << std::hex << std::setfill('0') << guid.Data1 << '-';
    os.width(4);
    os << std::hex << std::setfill('0') << guid.Data2 << '-';
    os.width(4);
    os << std::hex << std::setfill('0') << guid.Data3 << '-';
    os.width(2);
    os << std::hex << std::setfill('0')
        << static_cast<short>(guid.Data4[0])
        << static_cast<short>(guid.Data4[1])
        << '-'
        << static_cast<short>(guid.Data4[2])
        << static_cast<short>(guid.Data4[3])
        << static_cast<short>(guid.Data4[4])
        << static_cast<short>(guid.Data4[5])
        << static_cast<short>(guid.Data4[6])
        << static_cast<short>(guid.Data4[7]);

    std::string s(os.str());
    std::cout << s << std::endl;
    std::cout << s.length() << std::endl;
}

Пример вывода:

f6979589-b13c-416d-bf49-1497d99cd88
35
Press any key to continue . . .
  • 1
    Используйте << std::setfill('0')
  • 0
    Я попытался std::setfill('0') , но все еще вижу ту же проблему.
Показать ещё 3 комментария
Теги:
visual-studio-2013

1 ответ

1
Лучший ответ

Вам нужно задать размер поля для любого нового значения, которое вы выведете, например:

int main()
{
    GUID guid;
    CoCreateGuid(&guid);
    std::ostringstream os;
    os.width(8);
    os << std::hex << std::setfill('0') << guid.Data1 << '-';
    os.width(4);
    os << std::hex << std::setfill('0') << guid.Data2 << '-';
    os.width(4);
    os << std::hex << std::setfill('0') << guid.Data3 << '-';
    os.width(2);
    os << std::hex << std::setfill('0') << std::setw(2)
        << static_cast<short>(guid.Data4[0]) << std::setw(2)
        << static_cast<short>(guid.Data4[1])
        << '-' << std::setw(2)
        << static_cast<short>(guid.Data4[2]) << std::setw(2)
        << static_cast<short>(guid.Data4[3]) << std::setw(2)
        << static_cast<short>(guid.Data4[4]) << std::setw(2)
        << static_cast<short>(guid.Data4[5]) << std::setw(2)
        << static_cast<short>(guid.Data4[6]) << std::setw(2)
        << static_cast<short>(guid.Data4[7]);

    std::string s(os.str());
    std::cout << s << std::endl;
    std::cout << s.length() << std::endl;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню