0

我正在尝试编写一个函数,该函数从列表框中获取数据,检索帐户名称,然后使用 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 循环中的某处,因为它上方的消息框运行良好。任何建议将不胜感激。

4

1 回答 1

2

string strBuffer是一个空字符串,具有 size 0,并且在您尝试访问之前,您的代码中没有任何内容会strBuffer[iii]更改iiiequal 0。这将返回对已初始化值的引用char,即空终止字符。下一次,您访问 position 1,这是超出范围的,因此是未定义的行为。

我怀疑您正在篡改字符串的内部char数组数据,从而导致未定义的行为。大概是您传递给的一个或多个函数c_str()尝试修改它。这本身会导致未定义的行为。您不能将std::string'sc_str()用作可写字符缓冲区。

21.4.7.1 [string.accessorsconst charT* c_str() const noexcept ]和const charT* data() const noexcept

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

于 2013-02-19T16:22:32.460 回答