使用std :: bitset时程序崩溃,但仅在使用VC 2015编译时崩溃

时间:2017-01-03 16:39:51

标签: c++ visual-c++ std-bitset

我正在开发一个简单的程序,它将字符串转换为二进制代码并返回。我正在使用Ubuntu并希望使用Visual Studio 2015在Windows上编译该程序。虽然Linux版本运行良好,但在Windows上它可以编译,但是会崩溃,例如

bitset<N> char

调用以下函数时:

bool bin2string(std::string *psBinaryString, std::string *psCharakterString)
{
psCharakterString->clear();
char cTempArray[8];
char cTemp;

for(unsigned int i = 0; i < psBinaryString->length(); i += 8)
{
    for(unsigned int j = 0; j < 8; ++j)
    {
        cTempArray[j] = psBinaryString->c_str()[j + i];
    }
    std::bitset<8> Bitset(cTempArray);
    cTemp = static_cast<char>(Bitset.to_ulong());
    psCharakterString->push_back(cTemp);
}
return true;
}

现在,我的问题是,这段代码出了什么问题?为什么它适用于Linux(gcc)和Windows(MinGW),而不适用于使用Visual Studio 2015的Windows?

我目前的工作原则是:

#ifdef _WIN32

bool bin2string(std::string *psBinaryString, std::string     *psCharakterString)
{
psCharakterString->clear();
char cTempArray[8];
char cTemp;

for(size_t i = 0; i < psBinaryString->length(); i += 8)
{
    for(size_t j = 0; j < 8; ++j)
    {
        cTempArray[j] = psBinaryString->c_str()[j + i];
    }
    cTemp = static_cast<char>(strtol(cTempArray, 0, 2));
    psCharakterString->push_back(cTemp);
}
return true;
}

#else

bool bin2string(std::string *psBinaryString, std::string *psCharakterString)
{
psCharakterString->clear();
char cTempArray[8];
char cTemp;

for(unsigned int i = 0; i < psBinaryString->length(); i += 8)
{
    for(unsigned int j = 0; j < 8; ++j)
    {
        cTempArray[j] = psBinaryString->c_str()[j + i];
    }
    std::bitset<8> Bitset(cTempArray);
    cTemp = static_cast<char>(Bitset.to_ulong());
    psCharakterString->push_back(cTemp);
}
return true;
}

#endif

这两种解决方案中哪一项更好?

1 个答案:

答案 0 :(得分:4)

您的崩溃是由于std :: bitset的构造函数需要数组长度或空终止字符串这一事实引起的。

(请参阅http://en.cppreference.com/w/cpp/utility/bitset/bitset上的文档)

所以你应该使用:

std::bitset<8> Bitset(cTempArray, 8);