2013-02-19 2 views
0

목록 상자에서 데이터를 가져와 계정 이름을 검색 한 다음 SQL을 사용하여 계정 유형을 변경하는 함수를 작성하려고합니다. 그러나 어떤 이유로,이 코드는 목록 상자 항목에 'fdsa \ t \ tdungeon master'가 있지만 'asdf \ t \ tuser`가 아니라면 잘 작동합니다. 나중에 테스트 할 때 'auser \ t \ tuser'로 실패했습니다. 메시지 상자 기능은 올바른 데이터가 검색되고 있음을 나타냅니다. 가능한 원인은 무엇일까요?디버그 어설 션이 실패했습니다. 문자열 subscript가 범위를 벗어났습니다.

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

나는 100 % 문자열에 탭이 있는지 확인합니다. –

+0

예, 목록 상자에 제출 된 문자열의 형식이 "username + \ t \ t + accounttype"이고 목록 상자에 올바르게 표시됩니다. –

+0

'strBuffer'를 설정 한 곳을 볼 수 없지만 잊어 버렸습니까? 일부 코드? – PlasmaHH

답변

2

string strBuffer 크기 0로, 빈 문자열, 당신은 iii 동일한 0으로, strBuffer[iii]에 액세스하기 전에 것으로 변경 코드에서 아무것도 없다.으로 초기화 된 값, 즉 null 종료 문자에 대한 참조를 반환합니다. 다음 번에는 위치가 1이고 범위를 벗어나서 정의되지 않은 동작입니다.

의심스러운 부분은 문자열의 내부 char 배열 데이터를 변경하여 정의되지 않은 동작을 일으키는 것입니다. 아마도 하나 또는 그 이상의 함수를 c_str()에 전달하여 수정하려고 시도했을 것입니다. 이것은 그 자체로 정의되지 않은 행동을 유도합니다. std::stringc_str()을 쓰기 가능한 char 버퍼로 사용할 수 없습니다. 21.4.7.1 [string.accessors], const charT* c_str() const noexceptconst charT* data() const noexcept에서

는 :

필요 : 프로그램이 문자 배열에 저장된 임의의 값을 변경하지 않는다.

+0

또는 탭이없는 문자열 ... –

+0

'fdsa \ t \ tdungeonmaster'값을 사용하면 왜 정상적으로 작동합니까? 그래서 strAccountName [iii]을 사용할 때마다 실패한 + +를 사용하기 시작했습니다. 그렇다면 문자열의 첫 번째 부분을 가져 오는 방법은 무엇입니까? –

+0

@MatsPetersson 탭은 중요하지 않습니다. 빈 문자열에 대한 strBuffer [0]'에 대한 액세스가 먼저 발생합니다. – juanchopanza

관련 문제