c++ - 使用 std::bitset 时程序崩溃,但仅当使用 VC 2015 编译时

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

我正在开发一个将字符串转换为二进制代码并返回的简单程序。我在 Ubuntu 上工作,想在 Windows 上使用 Visual Studio 2015 编译该程序。虽然 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

这两种解决方案哪个更好?

最佳答案

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

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

所以你应该使用:

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

关于c++ - 使用 std::bitset 时程序崩溃,但仅当使用 VC 2015 编译时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41448210/

相关文章:

C# 等效于 c++ 中的 bool 运算符和 rhs

c++ - 使用 QNetworkReply 如何发布文件然后从服务器接收转换后的文件?

c++ - move 语义 std::move 如何使用它

c++ - MSVC(似乎不完美)对 constexpr 的支持

c++ - 如何合并两个 LPCWSTR?

c++ - 重载 std::bitset 的移位运算符

c++ - 将位集转换为带符号的

c++ - C++11中auto是如何实现的

c++ - 将枚举类与 std::bitset 一起使用

c++ - 使用命名空间的多重定义错误