C++读取字符串的字符时出错|发生在第10个字符之后
C++ Error reading characters of strings | Happens after the 10th character
我要求将信息保存到数据库中,比如他们的用户名和其他信息,你最多可以使用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
,所以也许你也有一些其他误解。
相关文章:
- 打印C++中字符出现之间/之后的所有子字符串
- C++代码,用于在用户插入的字符串的每个元音之后插入一对字符
- 如何在 Clang AST 中的源位置之后找到字符的源位置?
- 在字符串的每个元素(不使用弦乐)的每个元素之后插入字符
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- 直接在数组之后放置字符的可靠方法
- C :在字符串中找到一个char,然后在先前的char之后找到另一个字符
- Winsockets - 身体之前和/或之后的奇怪字符
- 为什么while循环会在输入的每个字符之后重复
- 瓦尔格林德:在字符[]到标准::向量迁移之后"Invalid write of size 1"<char>
- 在 wcsncpy 之后释放字符串会导致堆损坏
- 输入int之后的字符的c++输入数组
- wstring.find_last_not_of() 将国际字符之后的所有内容都视为空格
- 删除特定字符之后的所有内容
- C++读取字符串的字符时出错|发生在第10个字符之后
- 如何确保正则表达式只在某个字符之后匹配
- 封顶libcurl在X字符之后返回
- 第二个空格字符之后的字符串
- 在字符数组中查找前一个字符之后的字符
- Std::string::erase()将删除使用Std::string::find()找到的第一个字符之后的所有内容