Trong môn học của mình thì giáo viên yêu cầu là khi code bằng Visual Studio xong thì lấy biên dịch lại bằng MinGW. Nhưng mình không hiểu vì sao khi biên dịch bằng MinGW thì có một số case bị sai kết quả (không văng khỏi chương trình) trong khi với input đó thì Visual Studio chạy vẫn đúng. Xin mọi giải đáp giúp mình ạ.
Thắc mắc khi biên dịch C++ trong MinGW
- Vì MinGW sử dụng file header của GCC, còn VS compiler chỉ sử dụng header chuẩn
Nhưng 2 cái đó không quan trọng lắm, trừ khi bạn đụng vào cái gì đó của Windows trong Windows 10 SDK và phụ thuộc vào việc code của bạn làm gì nữa
P/s : hình như mình lạc đề …
MinGW là gì, là port của GCC sang Windows, nó cũng có headers của Windows, compile được code VS. Trừ lúc phải sử dụng compiler intrinsic, stdafx hoặc dùng đồ non-standard các kiểu mới nên để ý tới compiler behaviour. 90% use cases còn lại thì thằng nào cũng compile được code của thằng kia.
Ý mình là cả hai đều compile được nhưng với MinGW có vài cái input bị sai (hiện kết quả sai nhưng VS thì đúng) và nó cũng không văng khỏi chương trình gì cả.
em cho ví dụ đi, sai cái gì
Code đi em, ko có code sao biết sai ở đâu :V
toàn bộ code luôn thì 5 giây là ra chỗ nào sai thôi
Dạ bài của em là tự xây dựng thư viện string để tính toán các số lớn ạ.
- Hàm chia mà visual build đúng còn gcc build lại không ra đây ạ
bignumber bignumber::operator/(const bignumber &s)
{
bignumber a, b;
a = *this;
b = s;
if (b.num == "0")
{
return bignumber("Phep chia cho 0");
}
if (a.num < b.num)
{
return bignumber("0");
}
int m = size(a.num),n=size(b.num);
if (m == n)
{
for (int i = 9; i >= 0; i--)
{
bignumber temp1(1);
bignumber temp2;
temp1[0] = i + 48;
temp2 = b*temp1;
if (a.num >= temp2.num)
{
return temp1;
}
}
}
else
{
int x = 0;
bignumber kq(0);
bignumber choose;
choose.num = a.num.takeChar(n);
a.num.DichTrai(n);
while (1)
{
for (int i = 9; i >= 0; i--)
{
bignumber temp1(1);
temp1[0] = i + 48;
bignumber temp2;
temp2 = b*temp1;
if (choose.num >= temp2.num)
{
choose = choose - temp2;
kq[x] = i + 48;
x++;
STRING::CapPhatThem(kq.num,x, 1);
break;
}
}
if (!a.num.takeChar(1).isNULL())
{
choose.num = choose.num + a.num.takeChar(1);
if (choose[0] == '0')
choose.num.del(0);
a.num.DichTrai(1);
}
else
{
kq[x] = '\0';
break;
}
}
if (kq[0] == '0')
kq.num.del(0);
return kq;
}
}
#ifndef BIGNUMBER_H_
#define BIGNUMBER_H_
#include <iostream>
#include "STRING.h"
using namespace std;
class bignumber
{
private:
STRING num;
public:
bignumber();
bignumber(const bignumber&);
bignumber(const STRING&);
bignumber(const char*);
bignumber(int);
void nhap();
friend ostream& operator<<(ostream&o, const bignumber&);
char& operator[](int );
bignumber& operator=(const bignumber&);
bignumber operator+(const bignumber&);
bignumber operator-(const bignumber&);
bignumber operator*(const bignumber&);
bignumber operator/(const bignumber&);
~bignumber();
};
#endif
#ifndef STRING_H_
#define STRING_H_
#include <iostream>
using namespace std;
class STRING
{
private:
char *s;
public:
STRING();
STRING(int n);
STRING(const char*);
STRING(const STRING&);
void input();
void clear();
char& operator[](int i);
STRING& operator=(const STRING&);
friend ostream& operator<<(ostream &o, const STRING&);
bool operator==(const STRING&);
bool operator>(const STRING&);
bool operator<(const STRING&);
bool operator>=(const STRING&);
bool operator<=(const STRING&);
void del(int);
void add(char c, int x);
int findChar(const char& x);
STRING takeChar(int x);
void ganNULL();
bool isNULL();
void DichTrai(int ); //x=1-->"abc"-->"bc"
void DichPhai(int);//x=1--> "abc"-->" abc"
STRING operator+(const STRING&);
STRING operator+(const char*);
friend STRING operator+(const char*, const STRING &);
static void CapPhatThem(STRING&, int , int );
static void CapPhatThem(char*&, int, int);
friend int size(const STRING&);
friend int size(char*);
~STRING();
};
#endif
#include "STRING.h"
STRING::STRING(int n)
{
s = new char[n];
for (int i = 0; i < n; i++)
{
s[i] = '0';
}
}
STRING::STRING(const STRING &t)
{
int n = size(t);
s = new char[n + 1];
for (int i = 0; i <= n; i++)
{
s[i] = t.s[i];
}
}
STRING::STRING()
{
s = NULL;
}
STRING::STRING(const char *t)
{
int n=0;
while (t[n] != '\0')
{
n++;
}
s = new char[n + 1];
for (int i = 0; i <= n; i++)
{
s[i] = t[i];
}
}
void STRING::CapPhatThem(STRING &s, int n, int x)
{
STRING temp;
temp.s = new char[n];
for (int i = 0; i < n; i++)
{
temp.s[i] =s.s[i];
}
delete[]s.s;
s.s = new char[n + x];
for (int i = 0; i < n; i++)
{
s.s[i] = temp.s[i];
}
}
void STRING::CapPhatThem(char *& s, int n, int x)
{
char* temp;
temp = new char[n];
for (int i = 0; i < n; i++)
{
temp[i] = s[i];
}
delete[]s;
s = new char[n + x];
for (int i = 0; i < n; i++)
{
s[i] = temp[i];
}
delete[] temp;
}
int size(const STRING &s)
{
if (s.s == NULL)
return 0;
int size = 0;
int x = 0;
while (s.s[x] != '\0')
{
size++;
x++;
}
return size;
}
int size(char *s)
{
if (s == NULL)
return 0;
int size = 0;
int x = 0;
while (s[x] != '\0')
{
size++;
x++;
}
return size;
}
ostream & operator<<(ostream & o,const STRING& t )
{
int n = size(t);
for (int i = 0; i < n; i++)
{
o << t.s[i];
}
return o;
}
char& STRING::operator[](int i)
{
if (i < 0)
return s[0];
if (i >= size(s))
return s[size(s) - 1];
return s[i];
}
STRING & STRING::operator=( const STRING& t)
{
int n = size(t);
if (s!= NULL)
delete[] s;
s = new char[n + 1];
for (int i = 0; i < n; i++)
{
s[i] = t.s[i];
}
s[n] = '\0';
return *this;
}
STRING STRING::operator+(const STRING &t)
{
STRING temp;
temp.s = new char[size(t) + size(s) + 1];
int i = 0;
int j = 0;
while (j < size(s))
{
temp.s[i++] = s[j++];
}
j = 0;
while (j < size(t))
{
temp.s[i++] = t.s[j++];
}
temp.s[size(t) + size(s)]='\0';
return temp;
}
STRING STRING::operator+(const char *x)
{
STRING str(x);
return *this + str;
}
STRING operator+(const char *a, const STRING &s)
{
STRING str(a);
return str + s;
}
bool STRING::operator==(const STRING &t)
{
int n = size(t);
int m = size(s);
if (m != n)
return false;
else
{
for (int i = 0; i < n; i++)
{
if (s[i] != t.s[i])
return false;
}
return true;
}
}
bool STRING::operator>(const STRING &t)
{
if (size(s) > size(t))
return true;
if (size(s) < size(t))
return false;
if (size(s) == size(t))
{
int n = size(s);
for (int i = 0; i < n; i++)
{
if (s[i] > t.s[i])
return true;
else
{
if (s[i] < t.s[i])
return false;
}
}
return false;
}
return false;
}
bool STRING::operator<(const STRING &t)
{
if (size(s) < size(t))
return true;
if (size(s) > size(t))
return false;
if (size(s) == size(t))
{
int n = size(t);
for (int i = 0; i < n; i++)
{
if (s[i] < t.s[i])
return true;
else
{
if (s[i] > t.s[i])
return false;
}
}
return false;
}
return false;
}
bool STRING::operator>=(const STRING &t)
{
return !(*this<t);
}
bool STRING::operator<=(const STRING &t)
{
return !(*this>t);
}
void STRING::del(int x)
{
int n = size(s);
if (x < 0 || x >= n)
return;
for (int i = x; i < n; i++)
{
s[i] = s[i + 1];
}
STRING temp(n);
for (int i = 0; i < n; i++)
{
temp.s[i] = s[i];
}
delete[]s;
s = new char[n];
*this = temp;
}
void STRING::add(char c, int x)
{
int n = size(s);
STRING::CapPhatThem(*this, n + 1, 1);
n++;
for (int i = n - 1; i > x; i--)
{
s[i] = s[i - 1];
}
s[x] = c;
s[n] = '\0';
}
int STRING::findChar(const char & x)
{
int kq = -1;
int n = size(s);
for (int i = 0; i < n; i++)
{
if (s[i] == x)
{
kq = i;
break;
}
}
return kq;
}
STRING STRING::takeChar(int x)
{
if (x > size(s))
{
return STRING();
}
STRING kq(x+1);
for (int i = 0; i < x; i++)
{
kq[i] = s[i];
}
kq[x] = '\0';
return kq;
}
void STRING::DichTrai(int x)
{
for (int i = 0; i < x; i++)
{
del(0);
}
}
void STRING::DichPhai(int x)
{
STRING temp(size(s) + x + 1);
int n = size(s);
for (int i = x; i <= n + x; i++)
{
temp.s[i] = s[i - x];
}
*this = temp;
}
void STRING::input()
{
char a;
a = getchar();
s = new char[1];
int count = 0;
while (1)
{
if (a != '\n')
{
s[count] = a;
count++;
STRING::CapPhatThem(s,count, 1);
a = getchar();
}
else
{
s[count] = '\0';
break;
}
}
}
void STRING::ganNULL()
{
s = NULL;
}
void STRING::clear()
{
delete[]s;
s = NULL;
}
bool STRING::isNULL()
{
if (s == NULL)
return true;
return false;
}
STRING::~STRING()
{
if (s != NULL)
delete[]s;
else
s = NULL;
}
đầy đủ file bignumber.cpp với main.cpp luôn đi em =) đọc code dài ngại quá bật debugger lên cho lẹ =)
bignumber kq(0);
kq[x] = i + 48;
ko thấy bignumber(int);
nó khởi tạo ra sao thì làm sao biết sai chỗ nào. Nếu nó giống như
STRING::STRING(int n)
{
s = new char[n];
for (int i = 0; i < n; i++)
{
s[i] = '0';
}
}
thì tiêu tùng rồi vì new char[0]
có ra gì đâu :V
mà STRING kiểu gì chỗ thì có NULL, chỗ thì ko có NULL như trong hàm CapPhatThem @_@
- Dạ đây ạ, xem giúp em ở option 4 ạ. VS chạy đúng mà g++ chạy sai ở option này.
#include"bignumber.h"
void menu();
int main()
{
bignumber s1, s2;
int option;
menu();
cout << "\nMoi ban chon chuc nang: ";
cin >> option;
cin.ignore();
system("cls");
do
{
switch (option)
{
case 1:
cout << "Nhap so thu 1: \n";
s1.nhap();
cout << "Nhap so thu 2: \n";
s2.nhap();
cout << "Ket qua:\n";
cout << s1 + s2;
break;
case 2:
cout << "Nhap so thu 1: \n";
s1.nhap();
cout << "Nhap so thu 2: \n";
s2.nhap();
cout << "Ket qua:\n";
cout << s1 - s2;
break;
case 3:
cout << "Nhap so thu 1: \n";
s1.nhap();
cout << "Nhap so thu 2: \n";
s2.nhap();
cout << "Ket qua:\n";
cout << s1*s2;
break;
case 4:
cout << "Nhap so thu 1: \n";
s1.nhap();
cout << "Nhap so thu 2: \n";
s2.nhap();
cout << "Ket qua:\n";
cout << s1 / s2;
break;
default:
cout << "Ban da nhap sai chuc nang!!\n";
}
cout << "\n=============================================\n";
menu();
cout << "Moi ban nhap lai hoac nhap phim 0 de ket thuc: ";
cin >> option;
cin.ignore();
system("cls");
} while (option != 0);
return 0;
}
void menu()
{
cout << "\n1.Cong hai so lon.\n";
cout << "2.Tru hai so lon.\n";
cout << "3.Nhan hai so lon.\n";
cout << "4.Chia hai so lon.\n";
}
#include "bignumber.h"
bignumber::bignumber()
{
num.ganNULL();
}
bignumber::bignumber(const STRING &s)
{
num = s;
}
bignumber::bignumber(const char *t)
{
STRING temp(t);
num = temp;
}
bignumber::bignumber(int x)
{
STRING temp(x + 1);
temp[x] = '\0';
num = temp;
}
bignumber::bignumber(const bignumber &s)
{
num = s.num;
}
void bignumber::nhap()
{
num.input();
}
ostream& operator<<(ostream & o, const bignumber &s)
{
bignumber t = s;
int n = size(t.num);
for (int i = 0; i < n; i++)
{
o << t.num[i];
}
o << endl;
return o;
}
bignumber & bignumber::operator=(const bignumber &s)
{
num = s.num;
return *this;
}
bignumber bignumber::operator+(const bignumber &s)
{
STRING num1, num2;
num1 = this->num;
num2 = s.num;
int m, n;
m = size(num1);
n = size(num2);
if (m > n)
{
num2.DichPhai(m - n);
STRING kq(m + 2);
int x =m;
int flag = 0;
for (int i = m - 1; i >= 0; i--)
{
int temp = num1[i] - 48 + num2[i] - 48+flag;
if (temp < 10)
{
kq[x] = kq[x] - 48 + temp + 48;
flag = 0;
}
else
{
kq[x] = kq[x] - 48 + temp % 10 + 48;
flag = 1;
}
x--;
}
kq[m+1] = '\0';
while (kq[0] == '0')
{
kq.del(0);
}
bignumber _kq;
_kq.num = kq;
return _kq;
}
if (m == n)
{
STRING kq(m+2);
int x = m;
int flag = 0;
for (int i = m - 1; i >= 0; i--)
{
int temp = num1[i] - 48 + num2[i] - 48 + flag;
if (temp < 10)
{
kq[x] = kq[x] - 48 + temp + 48;
flag = 0;
}
else
{
kq[x] = kq[x] - 48 + temp % 10 + 48;
flag = 1;
}
x--;
}
kq[m+1] = '\0';
while (kq[0] == '0')
{
kq.del(0);
}
bignumber _kq;
_kq.num = kq;
return _kq;
}
if (m < n)
{
bignumber a, b;
a.num = num1;
b.num = num2;
return b + a;
}
}
char & bignumber::operator[](int i)
{
int n = size(num);
if (i < 0)
return num[0];
if (i >= n)
return num[n - 1];
return num[i];
}
bignumber bignumber::operator-(const bignumber &s)
{
bignumber num1, num2;
num1 = *this;
num2 = s;
int m = size(num1.num);
int n = size(num2.num);
if (num1.num == num2.num)
{
bignumber kq("0");
return kq;
}
else
{
if (num1.num > num2.num)
{
num2.num.DichPhai(m - n);
bignumber kq(m + 1);
kq.num[m] = '\0';
int x = m - 1;
int flag = 0;
for (int i = m - 1; i >= 0; i--)
{
int temp = (num1[i] - 48) - (num2[i] - 48)-flag;
if (temp >= 0)
{
kq[x] = kq[x] - 48 + temp + 48;
flag = 0;
}
else
{
kq[x] = kq[x] -48 + temp+10 + 48;
flag = 1;
}
x--;
}
while (kq[0] == '0')
{
kq.num.del(0);
}
return kq;
}
else
{
bignumber kq;
kq = num2 - num1;
kq.num.DichPhai(1);
kq[0] = '-';
return kq;
}
}
}
bignumber bignumber::operator*(const bignumber &s)
{
bignumber a, b;
a = *this;
b = s;
if (a.num == "0" || b.num == "0")
return STRING("0");
int signA=a.num.findChar('-'), signB= b.num.findChar('-');
if (signA != -1)
{
a.num.DichTrai(1);
bignumber kq = a*b;
kq.num = "-" + kq.num;
return kq;
}
if (signB != -1)
{
b.num.DichTrai(1);
bignumber kq = a*b;
kq.num = "-" + kq.num;
return kq;
}
int m = size(a.num);
int n = size(b.num);
int x, t, save;
x = t = m + n - 1;
save = 0;
bignumber kq(m+n+1);
kq[m + n] = '\0';
for (int i = n - 1; i >= 0; i--)
{
for (int j = m - 1; j >= 0; j--)
{
int temp = (b[i]-48) * (a[j]-48)+save;
if (temp < 10)
{
int k = kq[x] - 48 + temp;
if (k >= 10)
{
k = k % 10;
kq[x] = k + 48;
save=1;
x--;
}
else
{
kq[x] = k + 48;
save = 0;
x--;
}
}
else
{
if (j == 0)
{
int k = kq[x] - 48 + temp % 10;
if (k >= 10)
{
k = k % 10;
kq[x] = k + 48;
x--;
kq[x] = kq[x] - 48 + temp / 10 + 1 + 48;
x--;
}
else
{
kq[x] = k + 48;
x--;
kq[x] = kq[x] - 48 + temp / 10 + 48;
x--;
}
save = 0;
}
else
{
save = temp / 10;
int k = kq[x] - 48 + temp % 10;
if (k >= 10)
{
k = k % 10;
save++;
}
kq[x] = k + 48;
x--;
}
}
}
t--;
x = t;
}
while (kq[0] == '0')
{
kq.num.del(0);
}
return kq;
}
bignumber bignumber::operator/(const bignumber &s)
{
bignumber a, b;
a = *this;
b = s;
if (b.num == "0")
{
return bignumber("Phep chia cho 0");
}
if (a.num < b.num)
{
return bignumber("0");
}
int m = size(a.num),n=size(b.num);
if (m == n)
{
for (int i = 9; i >= 0; i--)
{
bignumber temp1(1);
bignumber temp2;
temp1[0] = i + 48;
temp2 = b*temp1;
if (a.num >= temp2.num)
{
return temp1;
}
}
}
else
{
int x = 0;
bignumber kq(0);
bignumber choose;
choose.num = a.num.takeChar(n);
a.num.DichTrai(n);
while (1)
{
for (int i = 9; i >= 0; i--)
{
bignumber temp1(1);
temp1[0] = i + 48;
bignumber temp2;
temp2 = b*temp1;
if (choose.num >= temp2.num)
{
choose = choose - temp2;
kq[x] = i + 48;
x++;
STRING::CapPhatThem(kq.num,x, 1);
break;
}
}
if (!a.num.takeChar(1).isNULL())
{
choose.num = choose.num + a.num.takeChar(1);
if (choose[0] == '0')
choose.num.del(0);
a.num.DichTrai(1);
}
else
{
kq[x] = '\0';
break;
}
}
if (kq[0] == '0')
kq.num.del(0);
return kq;
}
}
bignumber::~bignumber()
{
if (num.isNULL() == 0)
num.clear();
else
num.ganNULL();
}
#ifndef BIGNUMBER_H_
#define BIGNUMBER_H_
#include <iostream>
#include "STRING.h"
using namespace std;
class bignumber
{
private:
STRING num;
public:
bignumber();
bignumber(const bignumber&);
bignumber(const STRING&);
bignumber(const char*);
bignumber(int);
void nhap();
friend ostream& operator<<(ostream&o, const bignumber&);
char& operator[](int );
bignumber& operator=(const bignumber&);
bignumber operator+(const bignumber&);
bignumber operator-(const bignumber&);
bignumber operator*(const bignumber&);
bignumber operator/(const bignumber&);
~bignumber();
};
#endif
#include "STRING.h"
STRING::STRING(int n)
{
s = new char[n];
for (int i = 0; i < n; i++)
{
s[i] = '0';
}
}
STRING::STRING(const STRING &t)
{
int n = size(t);
s = new char[n + 1];
for (int i = 0; i <= n; i++)
{
s[i] = t.s[i];
}
}
STRING::STRING()
{
s = NULL;
}
STRING::STRING(const char *t)
{
int n=0;
while (t[n] != '\0')
{
n++;
}
s = new char[n + 1];
for (int i = 0; i <= n; i++)
{
s[i] = t[i];
}
}
void STRING::CapPhatThem(STRING &s, int n, int x)
{
STRING temp;
temp.s = new char[n];
for (int i = 0; i < n; i++)
{
temp.s[i] =s.s[i];
}
delete[]s.s;
s.s = new char[n + x];
for (int i = 0; i < n; i++)
{
s.s[i] = temp.s[i];
}
}
void STRING::CapPhatThem(char *& s, int n, int x)
{
char* temp;
temp = new char[n];
for (int i = 0; i < n; i++)
{
temp[i] = s[i];
}
delete[]s;
s = new char[n + x];
for (int i = 0; i < n; i++)
{
s[i] = temp[i];
}
delete[] temp;
}
int size(const STRING &s)
{
if (s.s == NULL)
return 0;
int size = 0;
int x = 0;
while (s.s[x] != '\0')
{
size++;
x++;
}
return size;
}
int size(char *s)
{
if (s == NULL)
return 0;
int size = 0;
int x = 0;
while (s[x] != '\0')
{
size++;
x++;
}
return size;
}
ostream & operator<<(ostream & o,const STRING& t )
{
int n = size(t);
for (int i = 0; i < n; i++)
{
o << t.s[i];
}
return o;
}
char& STRING::operator[](int i)
{
if (i < 0)
return s[0];
if (i >= size(s))
return s[size(s) - 1];
return s[i];
}
STRING & STRING::operator=( const STRING& t)
{
int n = size(t);
if (s!= NULL)
delete[] s;
s = new char[n + 1];
for (int i = 0; i < n; i++)
{
s[i] = t.s[i];
}
s[n] = '\0';
return *this;
}
STRING STRING::operator+(const STRING &t)
{
STRING temp;
temp.s = new char[size(t) + size(s) + 1];
int i = 0;
int j = 0;
while (j < size(s))
{
temp.s[i++] = s[j++];
}
j = 0;
while (j < size(t))
{
temp.s[i++] = t.s[j++];
}
temp.s[size(t) + size(s)]='\0';
return temp;
}
STRING STRING::operator+(const char *x)
{
STRING str(x);
return *this + str;
}
STRING operator+(const char *a, const STRING &s)
{
STRING str(a);
return str + s;
}
bool STRING::operator==(const STRING &t)
{
int n = size(t);
int m = size(s);
if (m != n)
return false;
else
{
for (int i = 0; i < n; i++)
{
if (s[i] != t.s[i])
return false;
}
return true;
}
}
bool STRING::operator>(const STRING &t)
{
if (size(s) > size(t))
return true;
if (size(s) < size(t))
return false;
if (size(s) == size(t))
{
int n = size(s);
for (int i = 0; i < n; i++)
{
if (s[i] > t.s[i])
return true;
else
{
if (s[i] < t.s[i])
return false;
}
}
return false;
}
return false;
}
bool STRING::operator<(const STRING &t)
{
if (size(s) < size(t))
return true;
if (size(s) > size(t))
return false;
if (size(s) == size(t))
{
int n = size(t);
for (int i = 0; i < n; i++)
{
if (s[i] < t.s[i])
return true;
else
{
if (s[i] > t.s[i])
return false;
}
}
return false;
}
return false;
}
bool STRING::operator>=(const STRING &t)
{
return !(*this<t);
}
bool STRING::operator<=(const STRING &t)
{
return !(*this>t);
}
void STRING::del(int x)
{
int n = size(s);
if (x < 0 || x >= n)
return;
for (int i = x; i < n; i++)
{
s[i] = s[i + 1];
}
STRING temp(n);
for (int i = 0; i < n; i++)
{
temp.s[i] = s[i];
}
delete[]s;
s = new char[n];
*this = temp;
}
void STRING::add(char c, int x)
{
int n = size(s);
STRING::CapPhatThem(*this, n + 1, 1);
n++;
for (int i = n - 1; i > x; i--)
{
s[i] = s[i - 1];
}
s[x] = c;
s[n] = '\0';
}
int STRING::findChar(const char & x)
{
int kq = -1;
int n = size(s);
for (int i = 0; i < n; i++)
{
if (s[i] == x)
{
kq = i;
break;
}
}
return kq;
}
STRING STRING::takeChar(int x)
{
if (x > size(s))
{
return STRING();
}
STRING kq(x+1);
for (int i = 0; i < x; i++)
{
kq[i] = s[i];
}
kq[x] = '\0';
return kq;
}
void STRING::DichTrai(int x)
{
for (int i = 0; i < x; i++)
{
del(0);
}
}
void STRING::DichPhai(int x)
{
STRING temp(size(s) + x + 1);
int n = size(s);
for (int i = x; i <= n + x; i++)
{
temp.s[i] = s[i - x];
}
*this = temp;
}
void STRING::input()
{
char a;
a = getchar();
s = new char[1];
int count = 0;
while (1)
{
if (a != '\n')
{
s[count] = a;
count++;
STRING::CapPhatThem(s,count, 1);
a = getchar();
}
else
{
s[count] = '\0';
break;
}
}
}
void STRING::ganNULL()
{
s = NULL;
}
void STRING::clear()
{
delete[]s;
s = NULL;
}
bool STRING::isNULL()
{
if (s == NULL)
return true;
return false;
}
STRING::~STRING()
{
if (s != NULL)
delete[]s;
else
s = NULL;
}
#ifndef STRING_H_
#define STRING_H_
#include <iostream>
using namespace std;
class STRING
{
private:
char *s;
public:
STRING();
STRING(int n);
STRING(const char*);
STRING(const STRING&);
void input();
void clear();
char& operator[](int i);
STRING& operator=(const STRING&);
friend ostream& operator<<(ostream &o, const STRING&);
bool operator==(const STRING&);
bool operator>(const STRING&);
bool operator<(const STRING&);
bool operator>=(const STRING&);
bool operator<=(const STRING&);
void del(int);
void add(char c, int x);
int findChar(const char& x);
STRING takeChar(int x);
void ganNULL();
bool isNULL();
void DichTrai(int ); //x=1-->"abc"-->"bc"
void DichPhai(int);//x=1--> "abc"-->" abc"
STRING operator+(const STRING&);
STRING operator+(const char*);
friend STRING operator+(const char*, const STRING &);
static void CapPhatThem(STRING&, int , int );
static void CapPhatThem(char*&, int, int);
friend int size(const STRING&);
friend int size(char*);
~STRING();
};
#endif
chỗ hàm void STRING::CapPhatThem(STRING &s, int n, int x)
nó nhảy số lung tung lạ quá :V
em coi lại mấy cái hàm tạo chuỗi mới phải có gán ‘\0’ hết đi, chỗ có chỗ ko sao được
Anh chạy được không anh, anh có dùng VS k ạ.
anh đang debug trên CodeBlocks đây =) nó nhảy tùm lum kì lạ thiệt =)
à cái hàm Bignumber opertor[] nó chặn [x] hèn gì. Lỗi chỗ này đó, sửa lại là kq.num.s[x] = u + 48
chỗ kq[x] nếu x >= size(kq) thì nó lại bị chặn, trong khi em ghi đè vào ký tự \0
nên nó bị chạy ngược :V
em sửa:
char & bignumber::operator[](int i)
{
/*int n = size(num);
if (i < 0)
return num[0];
if (i >= n)
return num[n - 1];*/
return num[i];
}
và
char& STRING::operator[](int i)
{
/*if (i < 0)
return s[0];
if (i >= size(s))
return s[size(s) - 1];*/
return s[i];
}
là nó chạy được. Ông VS bị khùng nên nó cho chạy đúng đó :V
operator[] em nên trả về thẳng s[i]
unsafe luôn, nếu muốn safe thì em viết phương thức .at(int)
riêng và throw khi truy cập sai chỉ số < 0 hay >= size. Đây cũng là cách STL nó làm.
em đi thay đổi s[i] trả về s[i-1] hay s[i+1] nó nhảy chữ tùm lum khó debug quá =) Nếu truy cập sai thì em quăng exception ra, đừng im ỉm tự động thay đổi chỉ số i nó như vậy rất khó debug.
viết 1 cái hàm check out of bound riêng:
char& STRING::at(int i)
{
if (i < 0 || i >= size(s))
throw "STRING::at(i) out of bounds";
return s[i];
}
...
char & bignumber::at(int i)
{
return num[i]; //index out of bounds sẽ được STRING nó check dùm
}
Trời… Ông VS :v
- Em cảm ơn anh nhiều ạ.
anh tự tick solution nha :V
5 giây thành cả tiếng
rảnh rỗi em bỏ hẳn cái STRING đi xài std::string
trong <string>
=) nghiên cứu từng hàm của nó xem nó khác và giống với STRING của em viết như thế nào
- Dạ, nhiều khi thấy vi diệu thiệt anh ạ. Tại vì cái ông VS ra đúng nên em tìm hết cách này tới cách kia vẫn không fix được cam chịu nộp bài luôn :v.
À tại tự nhiên 1 cái đúng 1 cái sai. Với VS nó chạy đúng nên mình k biết sai đâu luôn tại đó giờ chỉ debug trên VS :v