为什么string.empty()在字符串包含值时计算为true?
问题描述:
介绍为什么string.empty()在字符串包含值时计算为true?
我正在使用具有用于电子表格中的数据进行排序对话框的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时,它们的值已输入到编辑框中。当这些字符串显示为空时,它们如何能够用值来初始化其他变量?
答
这是错误。
std::string min;
MinEdit.GetWindowText(&min[0], 20);
该字符串没有长度,并且您要求GetWindowText写入该缓冲区。这是一个超限并导致未定义的行为。
相反,分配字符串中的一些空间,然后后来调整它的大小:
std::string min;
min.resize(20);
min.resize(MinEdit.GetWindowText(&min[0], min.size()));
答
你不能传递到std::string
需要的字符数组的功能,而不先设置缓冲区的大小,然后调整串通话结束后。
min.resize(20);
MinEdit.GetWindowText(&min[0], 20);
min.resize(strlen(&min[0]));
答
这是你的错误:
MinEdit.GetWindowText(&min[0], 20);
字符串仍然是空的,并且语句写入随机,未分配的内存。如果你需要编写成C++ std::string
从一个C API,您首先需要手动调整其大小:
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()));
顺便说一句,你真的想在Windows API(或MFC)中使用std::wstring
。它映射到整个Windows使用的本地字符编码。
在MFC中最好使用'CString'。 'CWnd :: GetWindowText'有一个需要'CString&'的重载。 –