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 << "\nChuoi 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 !

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;
}

2 Likes

Perfect :thumbsup:

Em sửa chỗ này

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

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á :joy:

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!

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

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

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 :smiley:

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

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

:thumbsup:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?