简介
我正在使用mfc创建一个应用程序,该应用程序有一个用于对电子表格中的数据进行排序的对话框。该对话框包含几个控件,包括编辑框。当用户单击“确定”按钮时,对话框应检索其首选项并关闭。
问题
从对话框获取信息时,包含信息的字符串始终注册为空。我在字符串所在的位置设置了一个断点,并且值似乎很好,但是当我调用任何函数来确定字符串的大小时,它显示为0。
代码
std::string min;
std::string max;
MinEdit.GetWindowText(&min[0], 20);
MinVal = atof(min.c_str());
MaxEdit.GetWindowText(&max[0], 20);
MaxVal = atof(max.c_str());
if (min.empty())
{
AfxMessageBox(_T("Please Enter A Minimum Value"));
return;
}
if (max.empty())
{
AfxMessageBox(_T("Please Enter A Maximum Value"));
return;
}
问题
为什么这些字符串总是注册为空?我检查了它们的长度,它返回为零,但当我检查MinVal和MaxVal时,它们具有输入编辑框的值。当这些字符串显示为空时,如何能够使用值初始化其他变量?
答案 0 :(得分:5)
这是错误。
std::string min;
MinEdit.GetWindowText(&min[0], 20);
该字符串没有长度,您要求GetWindowText写入该缓冲区。这是一个超支,它会导致未定义的行为。
相反,在字符串中分配一些空格,然后再调整大小:
std::string min;
min.resize(20);
min.resize(MinEdit.GetWindowText(&min[0], min.size()));
答案 1 :(得分:2)
在没有先设置缓冲区大小的情况下,您无法将select * from books b inner join authors a on b.book_id = a.book_id
where a.name = 'Good Author' and b.name = 'Good Book'
传递给需要字符数组的函数,然后在调用后调整字符串大小。
std::string
答案 2 :(得分:2)
这是你的错误:
MinEdit.GetWindowText(&min[0], 20);
字符串仍为空,并且语句写入随机的未分配内存。如果您需要从C API写入C ++ std::string
,首先需要手动调整它的大小:
min.resize(static_cast<size_t>(MinEdit.GetWindowTextLength()));
MinEdit.GetWindowText(&min[0], min.size());
或者,利用RAII成语:
std::string min(MinEdit.GetWindowText(),
static_cast<size_t>(MinEdit.GetWindowTextLength()));
顺便说一句,您确实希望将std::wstring
与Windows API(或MFC)一起使用。它映射到整个Windows中使用的本机字符编码。