2017-02-28 138 views
1

介绍为什么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时,它们的值已输入到编辑框中。当这些字符串显示为空时,它们如何能够用值来初始化其他变量?

+0

在MFC中最好使用'CString'。 'CWnd :: GetWindowText'有一个需要'CString&'的重载。 –

回答

5

这是错误。

std::string min; 
MinEdit.GetWindowText(&min[0], 20); 

该字符串没有长度,并且您要求GetWindowText写入该缓冲区。这是一个超限并导致未定义的行为。

相反,分配字符串中的一些空间,然后后来调整它的大小:

std::string min; 
min.resize(20); 
min.resize(MinEdit.GetWindowText(&min[0], min.size())); 
2

你不能传递到std::string需要的字符数组的功能,而不先设置缓冲区的大小,然后调整串通话结束后。

min.resize(20); 
MinEdit.GetWindowText(&min[0], 20); 
min.resize(strlen(&min[0])); 
2

这是你的错误:

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使用的本地字符编码。

相关问题