Lỗi out_of_range at memory location 0x00CFF8F0 trong C++ là gì

khi mình so sánh:
string lo;
getline(cin, lo);

        for (int i = 0; i < lo.size(); i++)
        {
                if (lo.at(i) == lo.at(i - 1))
        	{
        		break;
        	}
        }
        cout << lo << endl;

thi mình gặp lỗi Unhandled exception at 0x7535A832 in test1.exe: Microsoft C++ exception: std::out_of_range at memory location 0x00CFF8F0.

-Nhưng khi mình kết hợp dùng với hàm isgraph thì nó lại không gặp lỗi

for (int i = 0; i < lo.size(); i++)
	{
		if (isgraph(lo.at(i)))
		{

		}
		else
		{
			if (lo.at(i) == lo.at(i - 1))
			{
				cout << lo << endl;
			}
		}
	}

ae nào biết chỉ mình với.

i = 0 thì lo.at(i - 1) chạy kiểu gì hả bạn? lo là std::string, nó rất “nhạy cảm” với vụ này.
Lần sau bạn nên đọc kĩ lỗi và có search google trước khi hỏi.

Có 1 rổ kết quả cho bạn chọn nếu bạn google vói keyword “std::out_of_range at memory location”

mình lên gg r k thấy ms vào đây hỏi chứ ms học mà có phải học lâu r đâu vs cả mình dùng isgraph thì nó vẫn chạy dc nhưng k dùng isgraph thì nó bị lỗi

Viết câu có chấm phẩy giúp mình nhé. Mình không đủ hơi để đọc 1 lèo câu của bạn đâu :smile:
OK, nếu như bạn đã nói là bạn gg rồi, vậy thì trong câu hỏi bạn hãy nói rõ ra là “em đã gg hoài mà không tìm được kết quả”. Tuy nhiên, lỗi của bạn rất cơ bản, bạn có thể sử dụng công cụ debug của IDE để tìm lỗi chứ không nên quăng mỗi cái đoạn code lỗi lên đây và để đấy.

Bạn đang nói đến vấn đề nào thế?

string lo = “son tungMTP” ;

for (int i = 0; i < lo.size(); i++)
{
	if (isgraph(lo.at(i)))
	{

	}
	else
	{
		if (lo.at(i) == lo.at(i - 1))
		{
			cout << lo << endl;
		}
	}
	
	
}

tôi dùng ntn thì nó lại chạy được =)))

Bạn có hiểu hàm isgraph dùng để làm gì không thế?
Trong trường hợp này, tốt nhất nên đặt điều kiện của vòng for để tránh lỗi truy cập ngoài string như vừa rồi.

tôi lên gg thì thấy bảo hàm isgraph để kiểm tra xem trong kí tự đó có phải trong bảng mã ascii không nếu mà không thì nó trả về giá trị khác 0

ông sửa hộ tôi cho đúng với, cảm ơn trước =)))))

Bạn thử tư duy một chút:

  • Vai trò của hàm isgraph trong đoạn code này là gì? Có cần thiết phải giữ lại không?

Nếu như nhập 1 string toàn các kí tự trong bảng mã ASCII thì đâu cần phải kiểm tra nữa?

  • i = 0 -> i - 1 = -1 -> truy cập ngoài mảng -> i = ? để không bị truy cập ngoài mảng?

Code mà lười sửa vs debug thì… xin lỗi bạn.

2 Likes

không phải lười sửa mà là chưa bt hướng giải quyết ntn thôi =)))

Với i=0 thì khi chạy nó sẽ gọi lo.at(-1), ngoài phạm vi của mảng nên sẽ throw exception std::out_of_range. Bạn nên khởi tạo i=1.[quote=“huy99ls01, post:1, topic:51119”]
for (int i = 0; i < lo.size(); i++)
{
if (isgraph(lo.at(i)))
{
}
else
{
if (lo.at(i) == lo.at(i - 1))
{
cout << lo << endl;
}
}
}
[/quote]

Hàm isgraph kiểm tra kí tự có phải là kí tự in ra được màn hình hay không. Ở đây lo là chuỗi bạn nhập từ bàn phím nên toàn kí tự có thể in ra được. Do đó isgraph(lo.at(i) đúng và sẽ không nhảy vào block else nên không xảy ra exception.

1 Like

Trang này có thể giúp bạn phần nào

1 Like

đúng cái mình muốn hỏi, cảm ơn bạn duckhan

mình tìm rồi bạn ơi =))

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