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
我要求将信息保存到数据库中,例如他们的用户名和其他内容,您最多可以使用 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