添加大数字C ++ - 初始化程序失败

时间:2015-02-17 05:00:01

标签: c++ integer initialization dynamic-arrays

我正在尝试编写一个程序,允许将两个最多100位的数字加在一起和C ++。我已经经历了很多次代码,但是编译器告诉我在第61行初始化sum数组时出现问题。有关为什么会这样或者如何修复它的任何想法?

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

void add_nums(string number1, string number2)
{
   int min = (number1.length() < number2.length() ? 
              number1.length():number2.length());
   int max = (number1.length() < number2.length() ?                           
              number2.length():number1.length());

   int *n1 = new int[max];
   int *n2 = new int[max];

   for (unsigned int i=0; i < number1.length(); i++)
   {
      n1[i] = number1.at(number1.length() - 1 -i) - 48;
   }

   cout << number1 << endl;

   for (unsigned int i=0; i < number2.length(); i++)
   {
      n2[i] = number2.at(number2.length()-1 -i) - 48;
   }

   cout << number2 << endl;

   int carry = 0;

   int sum[] = new int[max];

   int k=0;
   for (k = 0; k < max; k++)
   {
      sum[k] = (n1[k] + n2[k] + carry) % 10;

      if ( (n1[k] + n2[k] + carry) >= 10)
         carry = 1;
      else carry = 0;
   }
   sum[max] = carry;

   for (int j= max; j >= 0; j--)
   {
      cout << sum[j] << endl;
   }
}

int main()
{
  string number1;
  string number2;

  cout << "Enter a number and press return (100 digits maximum): ";
  cin  >> number1;

  cout << "Enter a number and press return (100 digits maximum): ";
  cin  >> number2;

  add_nums(number1, number2);

  return 0;
}

4 个答案:

答案 0 :(得分:0)

正如迈克已经提到过你的问题就在这一行:

int sum[] = new int[max];

您编写它的方式是Java风格。

在C(++)中,它有点不同: 对于编译器,无法知道要创建的数组$ sum $的大小,因为max是在运行时计算的并且取决于输入。 这意味着您有两种不同的可能性来克服这个问题:

首先,但丑陋的方法: 定义一个恒定的最大大小,用这个大小创建数组,然后只使用你需要的大小:

const int MAX_SIZE = 101;
int sum[MAX_SIZE];

第二,大多数时候更好的方法: 这样做,就像之前做过一些行并使用指针一样:

int* sum = new int[max]

这会动态分配HEAP所需大小的内存。

Attenion! 您在代码中使用了new[],但从未使用delete[]。这意味着你分配了一些内存,但永远不会自由,一旦你不再需要它。在您的小程序中,这可能不会生效,但您应始终注意避免它。 如果你可以使用C ++ 11,它可能是使用&#34;唯一指针的最佳解决方案&#34;:

unique_ptr<int[]> n1(new int[max]);

如果最后一个引用被销毁,这些指针会自行删除。

答案 1 :(得分:0)

编译此程序时出现此错误

error: array initializer must be an initializer list

你不能这样声明

int sum[] = new int[max];

你需要这一行

int sum[max]

int *sum = new int[max]

不要忘记删除由new

创建的对象

答案 2 :(得分:0)

int sum[]=new int[max]不是C++编码风格。而是将其用作

int* sum = new int[max]

由于您有max的值,您也可以使用

静态声明它

int sum[max]

如果您使用的是前一种方法,请确保在某个时间点free指针,以避免内存泄漏。

答案 3 :(得分:0)

int sum[] = new int[max];

不是一个好的语法。这应该是

int *sum = new int[max];

或者,更好:

std::array<int, max> sum;

首选STL而不是C风格的数组。

修改


这是不正确的:

sum[max] = carry;

它应该是:

sum[max - 1] = carry;

因为索引在C ++中从0开始。