调试断言失败,字符串下标超出范围

Debug assertion failed, string subscript out of range

本文关键字:范围 下标 字符串 断言 失败 调试      更新时间:2023-10-16

我正在尝试编写一个函数,该函数从列表框中获取数据,检索帐户名称,然后使用SQL更改帐户类型。但是,由于某些原因,当列表框项包含"fdsa\t\tdungeon-master"而不包含"asdf\t\ttuser"时,此代码可以正常工作。在后来的测试中,它以"auser\t\t tuser"失败。消息框功能指示正在检索正确的数据。可能是什么原因造成的?

void ChangeAccountType(HWND hwnd, std::string NewType)
{
using namespace std;
string strQuery;
string strAccountName;
string strBuffer;
int nIndex = SendMessage(GetDlgItem(hwnd, IDC_LIST1), LB_GETCURSEL, 0, 0);
SendMessage(GetDlgItem(hwnd, IDC_LIST1), LB_GETTEXT, (WPARAM)nIndex, (LPARAM)strBuffer.c_str());
MessageBox(hwnd, strBuffer.c_str(), "", NULL);
for(int iii = 0; strBuffer[iii] != 't'; iii++)
{
    strAccountName += strBuffer[iii];
};
strQuery = "UPDATE account SET `account type` = "" + NewType + "" WHERE `User Name` = "" + strAccountName + """;
}

这个错误似乎发生在for循环中的某个地方,因为它上面的消息框工作得很好。任何建议都将不胜感激。

string strBuffer是一个空字符串,大小为0,在您尝试访问strBuffer[iii]之前,代码中没有任何内容会改变这一点,iii等于0。这将返回对初始化的值char的引用,即空终止字符。下一次,您访问位置1,该位置超出了界限,因此存在未定义的行为。

我怀疑您篡改了字符串的内部char数组数据,导致了未定义的行为。假设您传递c_str()的一个或多个函数试图修改它。这本身会导致未定义的行为。不能将std::stringc_str()用作可写字符缓冲区。

21.4.7.1[string.accessors]const charT* c_str() const noexceptconst charT* data() const noexcept:

要求:程序不得更改存储在字符数组中的任何值。