我尝试编写一个从列表框中获取数据的函数,检索帐户名,然后使用SQL更改帐户类型。但是,出于某种原因,当列表框项包含&fffa \ 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循环中的某个地方,因为它上方的消息框工作正常。任何建议都将不胜感激。
答案 0 :(得分:2)
string strBuffer
是一个空字符串,大小为0
,在您尝试访问strBuffer[iii]
之前,代码中没有任何内容会更改,iii
等于{ {1}}。这将返回对已初始化的值0
的引用,即空终止字符。下一次,您访问位置char
,这是超出范围,因此未定义的行为。
我怀疑你是在篡改字符串的内部1
数组数据,导致未定义的行为。据推测,您传递c_str()
的一个或多个函数试图修改它。这本身就会导致未定义的行为。您不能将char
的{{3}}用作可写的字符缓冲区。
来自 21.4.7.1 [string.accessors] ,std::string
和const charT* c_str() const noexcept
:
需要:程序不得更改存储在字符数组中的任何值。