30/09/2018, 23:44

Lỗi khi viết hàm tính Phép cộng bằng chuỗi

Mình đang viết 1 hàm có chức năng cộng 2 số bằng Chuỗi nhưng bị gặp lỗi !

Source code: http://codepad.org/zaopvj5F

void ChuanHoaChuoi(std::string s1, std::string s2)
{
	int len1 = s1.length();
	int len2 = s2.length();
	int Min = len1 < len2 ? len1 : len2, Max = len1 > len2 ? len1 : len2, space = Max - Min;
	if (Min == len1)
	{
		for (int i = 0; i < space; i++)
		{
			s1.insert(s1.begin(), '0');
		}
	}
	else if (Min == len2)
	{
		for (int i = 0; i < space; i++)
		{
			s2.insert(s2.begin(), '0');
		}
	}
}
std::string Tong(std::string s1, std::string s2)
{
	int r = 0, idx = 0;
	std::string a;
	ChuanHoaChuoi(s1, s2);
	int len = s1.length();
	for (int i = len - 1; i >= 0; i--)
	{
		int digit = (s1[i] - 48) + (s2[i] - 48) + r;
		r = digit / 10;
		digit %= 10;
		a[idx++] = digit + 48;
	}
	if (r != 0)
		a[idx++] = r + 48;
	// a[idx] = '';
	strrev((char *)a.c_str());
	return a;
}
int main()
{
	std::string s1, s2;
	std::cout << "
Nhap so thu 1: ";
	std::cin >> s1;
	std::cout << "
Nhap so thu 2: ";
	std::cin >> s2;
	std::string s3;
	s3 = Tong(s1, s2);
	std::cout << "
Ket qua tong = " << s3 << std::endl;
	system("pause");
	return 0;
}

Nhưng khi compile & run thì bị lỗi như sau:

Mọi người giúp mình nhé, xin cảm ơn rất nhiều

Nguyen Ca viết 01:53 ngày 01/10/2018

chú debug xem bị lỗi khoảng nào. nhìn code thấy debug khoảng 5 lần là ra :v

Nguyễn Xuân Phúc viết 01:44 ngày 01/10/2018

thử call watch lên debug xem
Visual nó có bộ debug mạnh thế mà không dùng, bác Bill biết là buồn lắm đấy

Gió viết 01:51 ngày 01/10/2018

string a; chưa có kích thước nên không truy cập a[idx++] được. Có thể dùng a.push_back(…) thay thế

Người bí ẩn viết 01:48 ngày 01/10/2018

2 anh @nxphuc và @nguyenhuuca cho em hỏi lỗi ở đâu thế ? Em debug rồi nhưng tới chỗ s3 = TinhTong(s1, s2) thì bấm F11 nó không cho nhảy vào hàm TinhTong

@Gio Anh có thể nói rõ hơn xíu được không ạ ? Vậy có cách nào làm cho string a “có kích thước” không ? Chứ em chưa biết cái vụ a.push_back(…)

Người bí ẩn viết 01:47 ngày 01/10/2018

Các cao thủ @nxphuc @Gio @nguyenhuuca rộng lòng giúp em với suy nghĩ cả tối nay mà chưa ra, visual nó không cho nhảy vào hàm Tổng

*grab popcorn* viết 01:47 ngày 01/10/2018

Bạn thay a[idx++] = xyz = a.push_back(xyz) như gió nói là ra.

Nguyễn Xuân Phúc viết 01:57 ngày 01/10/2018

Bạn thử tự trả lời 2 câu hỏi này được không nhé cũng là giúp bạn luyện tư duy luôn
1 - Ở hàm Tong, string a, vậy lúc này a đang chứa nội dung gì, và size của nó là bao nhiêu :3 liệu rằng a có phần tử thứ id để gán a[id] = bla bla không :-?
2 - Ở hàm ChuanHoa, 2 string s1 s2 đang được truyền theo hình thức nào? liệu rằng tụi nó và 2 string s1, s2 ở hàm Tong có liên quan gì với nhau hay không?

Người bí ẩn viết 01:55 ngày 01/10/2018

2 - Ở hàm ChuanHoa, 2 string s1 s2 đang được truyền theo hình thức nào? liệu rằng tụi nó và 2 string s1, s2 ở hàm Tong có liên quan gì với nhau hay không?

Đang được truyền theo phương thức bình thường. Em thử sửa lại cho nó là tham chiếu : std::string ChuanHoaChuoi(std::string &s1, std::string &s2) nhưng nó vẫn lỗi anh

1 - Ở hàm Tong, string a, vậy lúc này a đang chứa nội dung gì, và size của nó là bao nhiêu :3 liệu rằng a có phần tử thứ id để gán a[id] = bla bla không :-?

Em không hiểu cho lắm. Thường thì em học chuỗi bên C khi khai báo char string[MAX] là nó cho truy cập thoải mái nhưng bên C++ không hiểu sao khi khai báo std::string string rồi string[idx++] nó không cho như anh nói !
Và em cũng chưa biết cách nào để khắc phục cái lỗi này nữa anh

viết 01:45 ngày 01/10/2018

với std::string thì gọi += thay cho push_back, ngắn gọn hơn
a += digit + '0';

muốn đảo chuỗi thì đừng nên gọi strrev của C, vì c_str() trả về const char* tức là chỉ để đọc. Để đảo chuỗi hay đảo bất kì container nào thì xài std::reverse trong <algorithm> ấy:
std::reverse(begin(a), end(a));

Người bí ẩn viết 01:55 ngày 01/10/2018

Cho em hỏi 2 tham số trong std::reverse đi anh


Mà anh @tntxtnt có biết lỗi đoạn code trên không giúp em với chứ em rối về chuỗi bên C++ quá

viết 01:47 ngày 01/10/2018

2 tham số trong reverse và rất nhiều hàm khác trong <algorithm> là con trỏ hoặc iterator, chỉ cho biết là đảo từ vị trí nào tới vị trí nào trong a.

begin(a) là lấy iterator tới phần tử đầu tiên trong a. end(a) tới iterator tới phần từ phía sau phần tử sau cùng. Cho theo đúng kiểu ví dụ i chạy từ 0 tới n-1 thì mình ghi là i = 0 tới i < n chứ ko ghi n-1 ở đây.

ở đây a là container bất kì, có thể là string, vector, list, hay deque. Xài iterator sướng chỗ đó, ko cần biết container là loại gì (mảng khác xa với dslk). Với mảng thì em có thể xài con trỏ a tới a+n, hoặc gọi std::begin(a) tới std::end(a), phải thêm std:: vô trước nữa, hơi phiền.

begin(a) tới end(a) tức là đảo a từ đầu tới cuối.

nếu chỉ đảo 3 ký tự đầu thì em viết là begin(a) tới begin(a)+3

nếu chỉ đảo 3 ký tự thứ 2,3,4 (bắt đầu từ 0) thì em viết là begin(a)+2 tới begin(a)+5

v.v…

Người bí ẩn viết 01:47 ngày 01/10/2018

Vậy anh có thấy lỗi trong đoạn code trên không ạ ?

Chứ hơn 1 ngày rồi mà chả ai nói giúp em @@

Nguyễn Xuân Phúc viết 01:47 ngày 01/10/2018

có chắc là sau khi trả lời và sửa xong 2 câu hỏi của mình thì nó vẫn không chạy được?

Người bí ẩn viết 01:50 ngày 01/10/2018

Em chưa hiểu câu thứ 1 của anh ! Vì em học là khai báo std::string a; xong rồi dùng thôi ạ ?

Còn câu thứ 2 thì em nghĩ truyền thêm tham chiếu nhưng chưa được ạ

Nguyễn Xuân Phúc viết 02:00 ngày 01/10/2018

ày a đang chứa nội dung gì, và size của nó là bao nhiêu :3 liệu rằng a có phần tử thứ id để gán a[id] = bla bla

lúc vừa khai báo string a
thì lúc này trong a có gì?

Người bí ẩn viết 01:52 ngày 01/10/2018

Em nghĩ là a đang rỗng ạ !

Nguyễn Xuân Phúc viết 01:44 ngày 01/10/2018

nó rỗng
vậy length của nó bằng bao nhiêu?

Người bí ẩn viết 01:54 ngày 01/10/2018

Em nghĩ là 0 hoặc chưa có ?
Em chưa chắc về điều này !

Nguyễn Xuân Phúc viết 01:54 ngày 01/10/2018

nếu nó bằng 0 hay chưa có
vậy a[id++] tức a[0] có tồn tại hay không?

Người bí ẩn viết 01:52 ngày 01/10/2018

Dạ không ạ

Bài liên quan
0