0

リストボックスからデータを取得し、アカウント名を取得してから、SQLを使用してアカウントタイプを変更する関数を作成しようとしています。ただし、何らかの理由で、リストボックスアイテムに「fdsa \ t \tdungeonmaster」が含まれているが「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は空の文字列で、サイズ0はです。コードには、アクセスを試みる前にstrBuffer[iii]等しいiii値で変更するものはありません0。これは、初期化された値char、つまりnull終了文字への参照を返します。次回は、位置1にアクセスします。これは範囲外であるため、未定義の動作です。

私の疑いは、文字列の内部char配列データを改ざんして、未定義の動作を引き起こしているということです。おそらく、に渡す1つ以上の関数がc_str()それを変更しようとします。これ自体が未定義の動作につながります。std::string'sc_str()を書き込み可能なcharバッファとして使用することはできません。

21.4.7.1 [string.accessors]から、const charT* c_str() const noexceptおよびconst charT* data() const noexcept

必要条件:プログラムは、文字配列に格納されている値を変更してはなりません。

于 2013-02-19T16:22:32.460 に答える