C++ boost:uuid到char*中,不带std::string

C++ boost:uuid到char*中,不带std::string,c++,boost,uuid,stdstring,C++,Boost,Uuid,Stdstring,我正在尝试将boost UUID转换为char*,而不必使用std::string 我主要将to_string方法从修改为我自己的版本。但是,它在某些UUID上失败 这是我的修改: #include <boost/uuid/string_generator.hpp> #include <boost/uuid/uuid_generators.hpp> using UUID = boost::uuids::uuid; static constexpr std::size_

我正在尝试将boost UUID转换为
char*
,而不必使用
std::string

我主要将
to_string
方法从修改为我自己的版本。但是,它在某些UUID上失败

这是我的修改:

#include <boost/uuid/string_generator.hpp>
#include <boost/uuid/uuid_generators.hpp>

using UUID = boost::uuids::uuid;

static constexpr std::size_t UUID_STR_LEN = 37;

inline char uuid_byte_to_char(size_t i)
{
    if (i <= 9) {
        return static_cast<char>('0' + i);
    } else {
        return static_cast<char>('a' + (i - 10));
    }
}

inline void uuid_to_cstr(UUID const& uuid, char out[UUID_STR_LEN])
{
    std::size_t out_i = 0;
    std::size_t dash_i = 0;
    for (UUID::const_iterator it_data = uuid.begin(); it_data != uuid.end(); ++it_data, ++dash_i) {
        const size_t hi = ((*it_data) >> 4) & 0x0F;
        out[out_i++] = uuid_byte_to_char(hi);

        const size_t lo = (*it_data) & 0x0F;
        out[out_i++] = uuid_byte_to_char(lo);

        if (dash_i == 3 || dash_i == 5 || dash_i == 7 || dash_i == 9) {
            out[out_i++] += '-';
        }
    }
    out[UUID_STR_LEN - 1] = '\0';
}
#包括
#包括
使用UUID=boost::uuids::UUID;
静态constexpr std::size\u t UUID\u STR\u LEN=37;
内联字符uuid\u字节\u到\u字符(大小\u t i)
{
如果(i>4)&0x0F;
out[out_i++]=uuid_byte_to_char(hi);
const size\u t lo=(*it\u data)&0x0F;
out[out_i++]=uuid_byte_to_char(lo);
如果(破折号i==3 | |破折号i==5 | |破折号i==7 | |破折号i==9){
out[out_i++]+='-';
}
}
out[UUID_STR_LEN-1]='\0';
}
用法:

int main() {
    UUID uuid(uuid_generator());
    char uuid_cstr(UUID_STR_LEN];
    uuid_to_str(uuid uuid_cstr);
    std::cout << uuid_cstr << "\n";
}
intmain(){
UUID UUID(UUID_生成器());
char uuid_cstr(uuid_STR_LEN);
uuid_to_str(uuid-uuid_cstr);

std::cout您的缓冲区
char uuid_cstr[uuid_STR_LEN];
被分配到堆栈上,所以它有垃圾值,缓冲区中的所有元素都有一些初始值,可能不是0

1) 您可以通过将所有项设置为零

char uuid_cstr[UUID_STR_LEN];
memset (uuid_cstr,0,UUID_STR_LEN);
那么下面的语句就可以工作了

out[out_i++] += '-';
2) 或者使用作业

out[out_i++] = '-';

为什么要避免使用
std::string
?什么是临时副本?该头不执行
result.reserve(36)
到处都是。@Petrruderman避免内存分配避免不必要的动态分配是很高尚的。@LightnessRacesinOrbit你是对的。这仍然会分配内存。我正在尝试在堆栈上完成这一切,因为这是在非常快速的代码中使用的。我只需要对这一点多加一点注意。谢谢你抓住了这一点!解释道为什么错误总是出现在破折号上。
char uuid\u cstr[uuid\u STR\u LEN]={};