在重载运算符时发生分段错误>>对于Complex类

时间:2017-04-28 02:26:41

标签: c++

如果我想在我的c ++程序中使用这样的句子,

while (cin >> c)
  {
    cout << c << endl;
  }

c是我之前定义的Complex类。

如何重载运算符&gt;&gt;对于我的 Complex 类 我尝试了两种方法,但是当程序第二次运行上面的句子 cin&gt;&gt; c 时,由于分段错误而全部失败,
and the first method is 

friend istream& operator >> (istream& in, Complex& right)
{
    char a;
    char temp[50];
    int cnt = 0;
    double i = 0;
    double r = 0;
    while (in >> a)
    {
        if (a == ')')
        {
            temp[cnt] = a;
            break;
        }
        temp[cnt++] = a;
    }
    sscanf(temp, "(%lf,%lf)", &r, &i);
    right.real = r;
    right.imag = i;
}

第二种方法是

friend istream& operator >> (istream& in, Complex& right)
{
    double r = 0;
    double i = 0;
    in.ignore();
    in >> r;
    in.ignore();
    in >> i;
    in.ignore();
    right.real = r;
    right.imag = i;
}
我的意见是这样的

(适用1.5,2)(1,2.5)(1.5,2.5)(0,0)(1,2)

任何人都可以提供一些提示吗?

在temp结束时添加nullptr后,

我仍然遇到同样的问题,以下是错误的

  

编程接收信号SIGSEGV,分段故障。   在main.cpp中的f()中的0x0000000000401285:75   75(而cin&gt; c)   (gdb)s

2 个答案:

答案 0 :(得分:1)

首先,它是operator >>而不是friend istream& operator>> (istream& in, Complex& right) { in >> right.real; in >> right.imag; } (请注意缺少的空格)。

其次,为什么不呢:

operator<<

注意:您还需要重载cout << c << endl this.searchSolutions()才能正常工作。

答案 1 :(得分:1)

最有可能的问题是您使用非空终止的字符串调用sscanf

while (in >> a)
{
    if (a == ')')
    {
        temp[cnt] = a;
        break;
    }
    temp[cnt++] = a;
}

// Need to null terminate temp
temp[cnt+1] = '\0';
sscanf(temp, "(%lf,%lf)", &r, &i);