C++读取字符串的字符时出错|发生在第10个字符之后

C++ Error reading characters of strings | Happens after the 10th character

本文关键字:字符 之后 10个 出错 字符串 读取 C++      更新时间:2023-10-16

我要求将信息保存到数据库中,比如他们的用户名和其他信息,你最多可以使用10个字符,wstring可以保存它,我可以随心所欲地使用它,但如果用户键入11个字符,它会突然说"Error reading characters of strings"

一开始我觉得我没有足够大的空间放GetWindowText,所以我把它加大了,我不知道你是否可以改变wstring的容量,所以这就是我在这里问的原因。

为什么wstring只能使用10个或更少的字符?谢谢

case WM_COMMAND: {
    switch (LOWORD(wParam))
    {
        case IDB_REGISTERACCOUNT: {
            std::wstringstream SQLStatementStream;
            std::wstring SQLUsername;
            std::wstring SQLPassword;
            //Get user information than store in wide Strings
            GetWindowText(hUserNameRegister, &SQLUsername[0], 50);
            GetWindowText(hPasswordRegister, &SQLPassword[0], 50);
            std::wstring SQLStatement = SQLStatementStream.str();
            break;
        }
    }
    break;
}

您的代码本质上是在说,"我给您这个字符串的第一个字符的地址,开始不加区分地写入它。"这将是一个糟糕的时机。你需要做的是首先分配一个实际的缓冲区来存储结果,然后如果你想在wstring中使用,你可以使用wstring的'='运算符来进行正确的赋值。

类似于:

WCHAR temp[50];
GetWindowText(hUserNameRegister, temp, 50);
SQLUsername = temp

您在字符串末尾之后进行写入。这会导致未定义的行为。

仅当您处于只读模式时,或者当您正在写入但不打算更改字符串的长度时,才对标准库字符串使用&x[0]

你应该写:

wchar_t SQLUsername[50] = {};
GetWindowTextW(hUserNameRegister, SQLUsername, 50);

然后,如果你想使用std::wstring wsSQLUsername = SQLUsername;,你可以转换为wstring——然而,在它们超出范围之前,你的代码从未真正使用过wstring,所以也许你也有一些其他误解。