I am trying to implement Big Number in c++ with strings. First I am doing operator overloading for '+' operator, addition for digit length > 3 is coming correct but for less than 3 is giving garbage value after result. I am not understanding why this is happening. Here is my code.
#include<iostream>
#include<cstring>
#define SIZE 100
using namespace std;
class BigNumber
{
char *chNumber;
long nLength,nMaxLength;
public :
BigNumber()
{
nLength = nMaxLength = 0;
Init();
}
BigNumber(long length)
{
nLength = length;
nMaxLength = length;
Init();
}
BigNumber(const char *str,long length)
{
nLength = strlen(str);
nMaxLength = length;
Init();
memset(chNumber,0,sizeof(char));
strncpy(chNumber,str,length);
}
/*** copy constructor **/
BigNumber(const BigNumber &source)
{
nLength = strlen(source.chNumber);
nMaxLength = source.nMaxLength;
if(source.chNumber)
{
Init();
strncpy(chNumber,source.chNumber,nLength);
}
else
chNumber = 0;
}
void Init()
{
chNumber = new char[nMaxLength + 5];
memset(chNumber,0,sizeof(char));
}
~BigNumber()
{
delete[] chNumber;
chNumber = 0;
nLength = 0;
}
char* getNumber()
{
return chNumber;
}
const long size() const
{
return nLength;
}
const long capacity() const
{
return nMaxLength;
}
friend long maxsize(BigNumber &obj1,BigNumber &obj2)
{
return (obj1.size() > obj2.size()) ? obj1.size():obj2.size();
}
friend ostream& operator<<(ostream &out,BigNumber &obj)
{
//out<<"String is "<<obj.chNumber<<" of length "<<obj.nLength
// <<" and max length allocated is "<<obj.nMaxLength;
out<<obj.chNumber;
return out;
}
friend istream& operator>>(istream &in,BigNumber &obj)
{
obj.Init();
in>>obj.chNumber;
obj.nLength = strlen(obj.chNumber);
return in;
}
BigNumber &operator=(const BigNumber &obj)
{
if(this == &obj)
{
return *this;
}
delete[] chNumber;
chNumber = 0;
nLength = strlen(obj.chNumber);
Init();
strncpy(chNumber,obj.chNumber,nLength);
return *this;
}
void operator=(char * str)
{
nLength = strlen(str);
Init();
strncpy(chNumber,str,nLength);
}
friend BigNumber reverse(const BigNumber &obj1)
{
long length = obj1.size();
int m=0;
BigNumber obj2(length+5);
for(int i=length-1;i>=0;--i)
{
obj2.chNumber[m++]=obj1.chNumber[i];
}
obj2.chNumber[m]='\0';
//cout<<obj2.chNumber<<endl;
obj2.nLength = m;
return obj2;
}
friend BigNumber operator+(BigNumber &obj1,BigNumber &obj2)
{
long newLength = maxsize(obj1,obj2);
BigNumber obj3(newLength + 5);
int length1 = obj1.size();
int length2 = obj2.size();
int i,j,carry=0,num,m=0;
for(i=length1-1,j=length2-1; i>=0 || j>=0 ; --i,--j)
{
if(i>=0 && j>=0)
{
num = (obj1.chNumber[i]-'0') + (obj2.chNumber[j]-'0') + carry;
}
else if(i>=0)
{
num = obj1.chNumber[i] - '0' + carry;
}
else if(j>=0)
{
num = obj2.chNumber[j] - '0' + carry;
}
carry = num/10;
num = num%10;
obj3.chNumber[m++] = num+'0';
}
obj3.chNumber[m]='\0';
obj3.nLength = m;
BigNumber obj4 = reverse(obj3);
cout<<obj4<<endl;
return reverse(obj3);
}
};
void test_addition()
{
BigNumber n1("42",3),n2("1",2),n3;
n3 = n1 + n2;
cout<<n3<<endl;
n1 = "123";
n2 = "345";
n3 = n1 + n2;
cout<<n3<<endl;
}
int main()
{
test_addition();
return 0;
}
Before returning from operator+() function, I am printing sum its giving correct output and after returning I am printing is giving junk values after result.
Thank You