当字符串包含值时,为什么string.empty()会求值为true?

时间:2017-02-28 17:22:18

标签: c++ string mfc

简介

我正在使用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时,它们具有输入编辑框的值。当这些字符串显示为空时,如何能够使用值初始化其他变量?

3 个答案:

答案 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中使用的本机字符编码。