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

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

我要求将信息保存到数据库中,例如他们的用户名和其他内容,您最多可以使用 10 个字符,wstring 保存它,我可以随意使用它,但是如果用户要输入 11 个字符,它会突然说 "Error reading characters of strings".

起初我以为我没有足够大的 space 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;
}

您写过了字符串的末尾。这会导致未定义的行为。

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

你应该写:

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

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

你的代码本质上是在说,"I am giving you the address of the first character of this string, start writing to it indiscriminately."这将是一个糟糕的时刻。您需要做的是首先分配一个实际的缓冲区用于存储结果,然后如果您想要在 wstring 中,您可以使用 wstring 的 '=' 运算符进行正确的分配。

类似于:

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