繁体   English   中英

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

[英]Debug assertion failed, string subscript out of range

我正在尝试编写一个从列表框中获取数据的函数,检索帐户名,然后使用SQL更改帐户类型。 但是,出于某种原因,当列表框项包含'fdsa \\ t \\ tdungeon master'而不是'asdf \\ t \\ tuser`时,此代码可以正常工作。 在以后的测试中,'auser \\ 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()用作可写的char缓冲区。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM