30/09/2018, 23:07

Không tìm được lỗi trong code giải bài tập về Chuỗi!

Hi mọi người. Mình đang làm 1 bài tập về chuỗi nhưng code bị lỗi, không tìm ra được.

Đề bài: Cho 1 chuỗi, hãy đảo ngược thứ tự từng ký tự trong từng từ của chuỗi.
VD: Hoc Lap Trinh
=> Đảo lại là: hnirT paL coH

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

#include <iostream>
#include <string>
using namespace std;
int StrWrdLen(string s, int vitri) // hàm này dùng để đếm số ký tự có trong 1 từ của chuỗi s
{
	int Dem = 0;
	for (int i = vitri;; i++)
	{
		if (s[i] != 32)
			Dem++;
		else
			break;
	}
	return Dem;
}
void HoanVi(char &x, char &y)
{
	char Temp = x;
	x = y;
	y = Temp;
}
int main()
{
	string s = "Tu Canh Minh";
	int length = s.length();
	int lenwrd, end;
	if (s[0] != 32)
	{
		lenwrd = StrWrdLen(s, 0);
		end = lenwrd - 1;
	}
	for (int i = 0; i < length; i++)
	{
		if (i > 0 && s[i - 1] == 32 && s[i] != 32)
		{
			lenwrd = StrWrdLen(s, i);
			end = lenwrd - 1;
		}
		if (i >= lenwrd / 2)
			continue;
		HoanVi(s[i], s[end--]);
	}
	cout << "
Chuoi sau khi dao nguoc ky tu tung tu: " << s << endl;
 
	system("pause");
	return 0;
}

Nhưng khi compile và chạy, code em bị lỗi như tấm hình dưới này:

Ai rành giúp em nhé ! Xin cảm ơn !

Sáng Béo viết 01:09 ngày 01/10/2018

Lỗi đấy do trong hàm StrWrdLen bạn không check xem i có vượt quá độ dài của chuỗi s hay không nên khi xét đến từ cuối cùng của chuỗi nó không có dấu cách nên i cứ tăng và vượt quá độ dài chuỗi thì bị lỗi Out Of Range.

Bài của bạn sau khi sửa lỗi thì mình có sửa 1 số chỗ ở phía dưới để chạy đúng.

#include <iostream>
#include <string>
using namespace std;
int StrWrdLen(string s, int vitri)
{
	int Dem = 0;
	for (int i = vitri; i < s.length(); i++) //Sửa ở đây
	{
		if (s[i] != 32)
			Dem++;
		else
			break;
	}
	return Dem;
}
void HoanVi(char &x, char &y)
{
	char Temp = x;
	x = y;
	y = Temp;
}
int main()
{
	string s = "Tu Canh Minh";
	int length = s.length();
	int lenwrd, start, end; // Sửa ở đây
	if (s[0] != 32)
	{
		start = 0; // Ở đây nữa
		lenwrd = StrWrdLen(s, 0);
		end = lenwrd - 1;
	}
	for (int i = 0; i < length; i++)
	{
		if (i > 0 && s[i - 1] == 32 && s[i] != 32)
		{
			start = i; // Ở đây nữa nè
			lenwrd = StrWrdLen(s, i);
			end = start + lenwrd - 1; // Rồi đây nữa
		}
		if (i >= (start + lenwrd / 2)) // Chỗ cuối cùng rồi nha
			continue;
		HoanVi(s[i], s[end--]);
	}
	cout << "\nChuoi sau khi dao nguoc ky tu tung tu: " << s << endl;

	system("pause");
	return 0;
}

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

Perfect

Em sửa chỗ này

if (s[i] != 32)

thành
if ((s[i] >= 65 && s[i] <= 90) || (s[i] >= 97 && s[i] <= 122))
thì chỗ này

for (int i = vitri; < s.length(); i++)

em vẫn giữ nguyên for (int i = vitri;; i++) nó vẫn chạy ra đúng thì có nên dùng (giữ) cách này luôn hay có cần đổi sang cách của anh không ?

Anyway, Anh Bèo Tuyệt quá

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

Anh Béo đẹp trai xem giúp em thêm 1 đoạn code này nữa đi ạ !

string DltStrSpc(string s)
{
	int len = s.length();
	for (int i = 0; i < len; i++)
	{
		if (s[i] == 32)
		{
			s.erase(s.begin() + i);
		}
	}
	return s;
}
int main()
{
	string s = "Tu Canh Minh";
	string s1 = DltStrSpc(s);
	cout << s1;
	system("pause");
	return 0;
}

Đề bài: Xóa hết các khoảng trắng trong 1 chuỗi cho trước !

Còn lỗi thì y hệt như trên!

Sáng Béo viết 01:18 ngày 01/10/2018

nó vẫn chạy ra đúng

hmm… nó vẫn chạy đúng mà không bị lỗi à.
à đúng rồi. vì đến kí tự cuối cùng là kí tự kết thúc chuỗi nên nó vẫn out ra được.

còn việc nên dùng cách nào thì mình không biết, nhưng mình vẫn thích thêm cái điều kiện dừng vòng lặp kia cho chắc ăn. he

Anh Bèo

mình là Béo cơ mà… Bèo lại thành ra Bánh Bèo

xem giúp em thêm 1 đoạn code này nữa

Chỗ này len cố định là độ dài của chuỗi trước khi xoá
for (int i = 0; i < len; i++)
Vậy trong vòng for này nếu xoá đi 1 kí tự thì độ dài chuỗi sẽ bị giảm đi nhưng cái len nó vẫn là thế nên sẽ có lúc s[i] vượt quá độ dài của chuỗi hiện tại (đã bị xoá vài kí tự)

Mình sửa hàm delete như sau:

string DltStrSpc(string s)
{
	int i = 0;
	while (i < s.length())
	{
		if (s[i] == 32)
		{
			s.erase(s.begin() + i);
		}
		i++;
	}
	return s;
}

Mình dùng while vì hồi còn học cấp 3 cô giáo có nói là nếu điều kiện thay đổi thì nên dùng vòng lặp while. không biết có đúng không nhưng thành thói quen rồi

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

mình là Béo cơ mà… Bèo lại thành ra Bánh Bèo

Em đánh VNI, gõ nhầm số 1 thành số 2 nên không để ý

Mình sửa hàm delete như sau:

Oh, sai lỗi ngớ ngẩn quá, thanks anh !

Mình dùng while vì hồi còn học cấp 3 cô giáo có nói là nếu điều kiện thay đổi thì nên dùng vòng lặp while. không biết có đúng không nhưng thành thói quen rồi

Bài liên quan
0