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 !
Bài liên quan
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.
Perfect
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á
Anh Béo đẹp trai xem giúp em thêm 1 đoạn code này nữa đi ạ !
Đề 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
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:
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
Em đánh VNI, gõ nhầm số 1 thành số 2 nên không để ý
Oh, sai lỗi ngớ ngẩn quá, thanks anh !