【问题标题】:convert bitfield to string C++将位域转换为字符串 C++
【发布时间】:2015-04-20 18:20:34
【问题描述】:

我想将位域转换为字符串。 Visual Studio 2008 给出了无效的空指针异常。

也许它与数组的大小有关。它必须是 8,但输出显示它是 4,但为什么呢?

class Converter
{
public:
    string bitfieldToString (bool b_input[])
    {
        string c_conv;
        int i;
        for(i = 0; i < sizeof(b_input) ; i++)
        {
            if(b_input[i]=false){
                c_conv.append("0");
            }
            else if (b_input[i]=true){
                c_conv.append("1");
            }
            else c_conv = "Input is not a bitfield";break;
        }
        cout<<c_conv<<" "<< sizeof(b_input)<<endl;
        return (0);
    }
};
int main(void)
{
    Converter converter;
    bool b2[8] = {0,1,0,0,1,0,1,1};
    converter.bitfieldToString(b2);
    return (0);
}

谢谢! 现在一切都按预期工作。 很抱歉那个转储问题。我是 C++ 新手。

【问题讨论】:

  • sizeof(bool[]) 应该是 sizeof(*bool) 当我没有完全错误时,在 32 位平台上是 4 字节。
  • 最简单的方法是使用一个或多个std::bitsetstd::bitset::to_string() 函数。
  • sizeof(b_input) 这不起作用。将数组大小作为参数传递或使用std::vector
  • 我选择-1,因为它不包含任何与位域相关的问题,因此会产生误导!

标签: c++ nullpointerexception converter bit-fields


【解决方案1】:

例外是因为你return (0);。这被解释为空指针,用于使用构造函数初始化 std::string,该构造函数需要指向 C 样式字符串的有效指针 - 而不是空指针。

应该是return c_conv;

大小不匹配是因为b_input 不是数组。作为函数参数,bool b_input[] 是一个指针。您不能将数组按值传递给函数;并且无法仅从指针确定数组大小。所以sizeof(b_input) 给你的是指针的大小,而不是数组的大小,然后一切都出错了。

有几个选项。您可以将大小作为第二个参数传递;但这很容易出错。您可以通过引用数组来推断大小作为模板参数:

template <size_t size>
string bitfieldToString (bool (&b_input)[size])

您可以使用std::arraystd::vector,它们有方便的size() 成员函数。 (但要小心vector&lt;bool&gt;,因为它是一种特殊情况,其行为并不总是像标准容器一样。)或者您可以使用std::bitset,它有一个方便的to_string 函数,可以完全满足您的需求。

最后,启用编译器的警告——它应该告诉你不要使用=,你的意思是==。并且对于布尔值既非真非假的情况进行检查也没有多大意义。您可以将整个循环体缩减为

c_conv.append(b_input[i] ? '1' : '0');

【讨论】:

    【解决方案2】:

    您的代码中有一个很多错误。

    首先,空指针异常来自bitfieldToString函数末尾的return (0);。您已将其定义为返回 string;当您改为return 0 时,C++ 认为0 是一个char* 指针,并会尝试将它(一个NULLpointer)转换为一个字符串,这将崩溃。您可能应该返回 c_conv

    其次,sizeof(b_input) 将始终是 bool 指针的大小。在 32 位系统上为 4,在 64 位系统上为 8。您无法通过 sizeof 获取作为参数传递的数组的长度;您需要在函数中添加一个长度参数。

    第三,在您的 for 循环中,您将 分配b_input[i],而不是比较这些值。使用==,而不是=

    第四,在最后一个else 分支中,您缺少大括号。从本质上讲,break 在第一次迭代后总是会跳出循环。

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      相关资源
      最近更新 更多