Lỗi "terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::at" trong bài lập trình của mình

Mô tả: Cho 2 câu thơ viết liền nhau, mỗi câu cách nhau dấu gạch phải (/). Kiểm tra xem 2 câu thơ đó có phải là thơ lục bát không? Các câu thơ đã bỏ dấu tiếng Việt (tức tiếng Việt không dấu).
Luật kiểm tra:
Vần trong từ cuối của câu lục trùng với vần của từ thứ 6 trong câu bát.

Ví dụ về thơ lục bát đúng:
Lá vàng, đỏ rụng vào th[u]
Chị mây, chị gió liền r[u] chiếc cành

Rượu say men ái ân n[ồng]
Người vui duyên mới pháo h[ồng] tân hôn

Input:
– Dòng 1: Một số nguyên n cho biết số lượng cặp thơ cần kiểm tra
– n dòng tiếp theo: mỗi dòng là một cặp thơ, phân cách giữa hai câu là dấu gạch phải (/).
Ouput:
– n dòng, mỗi dòng là kết quả kiểm tra một cặp thơ. Nếu đúng thì ghi là TRUE, nếu sai thì ghi là FALSE

Ví dụ:

Input:
2
Mua sa roi giot gieng khoi/Con mong chi nua ai loi thuy chung
Ruou say men ai an nong/Nguoi vui duyen moi phao hoa tan hon

Output:
TRUE
FALSE

Code của mình:

#include <iostream>
#include <string>

using namespace std;

string Seperate(string &str);
int Locate(string str);
bool NotVowelCheck(string str);
int Process(string str, string a);
int CountWords(string str);

int main() {
	
	string Poem[10], eightwords;
	int n;
	
	cin >> n;
	cin.ignore();
	
	for(int i = 0; i < n; i++) {
		getline(cin, Poem[i]);
	}
	
	for(int i = 0; i < n; i++) {
		eightwords = Seperate(Poem[i]);
		if(CountWords(Poem[i]) != 6 || CountWords(eightwords) != 8) //kiem tra co dung la 6 8 khong
			cout << "FALSE" << endl;
		else {
			if(Process(Poem[i], eightwords))	cout << "TRUE" << endl;
			else	cout << "FALSE" << endl;
		}	
	}		
}

//chia thanh 2 string
string Seperate(string &str) {
	
	string EightWord = "";
	EightWord = str.substr(str.find('/') + 1);
	str.erase(str.find('/'));
	
	return EightWord;
}

//Dinh vi tu thu 6 trong moi cau tho
int Locate(string str) {
	int count = 0;
	int pos = 0;
	while(count < 5) {
		if(str.at(pos) == ' ')	count++;
		pos++;
	}
	return pos;
}

//kiem tra nguyen am
bool NotVowelCheck(string str) {
	string s = "aieou";
	for(int i = 0; i < 5; i++) {
		if(str.at(0) == s.at(i))	return false;
	}
	return true;
}

int Process(string str, string a) {
	
//giu tu thu 6 trong cau 1
	str.erase(0, Locate(str));
//giu tu thu 6 trong cau
	a.erase(0, Locate(a));
	if(a.find(' ') >= 0)
		a.erase(a.find(' '));
	
//giu lai phan van trong tu
	while(NotVowelCheck(str)) {
		str.erase(0, 1);
	}
	
	while(NotVowelCheck(a)) {
		a.erase(0, 1);
	}
	
//so sanh 2 phan van
	if(!str.compare(a)) 
		return 1; //2 phan van giong nhau, ket luan la tho luc bat
	return 0; //nguoc lai
}

//dem so tu trong moi cau
int CountWords(string str) {
	int count = 0;
	
	for(int i = 0; i < str.length() - 1; i++)
		if(isspace(str.at(i)) && !isspace(str.at(i + 1))) count ++;
	
	if(isspace(str.at(0)))
		return count;
	else
		return count + 1;
}

Bạn không nêu rõ lỗi dòng nào (toàn bộ thông báo lỗi). Theo mình thấy do bạn truy xuất vượt độ dài của chuỗi (gọi string.at()) nên xuất hiện lỗi này.

Compile thì đúng cú pháp hết bạn ơi, nên mình cũng không biết chính xác lỗi dòng nào, còn báo lỗi là do compiler của https://chamcode.net/ (chỉ thông báo kết quả đúng or lỗi) nên mình cũng không biết case đấy như nào để sửa @@

À, lỗi khi test case này bạn ơi:

Cam phan nao dam ghen ty/Ai tinh me muoi biet ly voi chang

Mình tìm ra lỗi rồi ạ
Code:

bool NotVowelCheck(string str) {
	string s = "aieou"; // -> string s = "aieouy";
	for(int i = 0; i < 5; i++) { // ->for(int i = 0; i < 6; i++)
		if(str.at(0) == s.at(i))	return false;
	}
	return true;
}

Đoạn này sai rồi :slight_smile:

// line 71 - 72
if(a.find(' ') >= 0)
	a.erase(a.find(' '));

vì nếu không tìm ra std::string::find sẽ trả về một con số rất lớn std::npos và số này dương :smiley:

1 Like

À đúng rồi, mình cảm ơn ạ :smiley:

A post was split to a new topic: Thắc mắc cách nhập ký tự Unicode qua bàn phím trong c++

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