c++ - 当字符串包含一个值时,为什么 string.empty() 的计算结果为真?

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

最佳答案

这是错误。

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

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

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

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

关于c++ - 当字符串包含一个值时,为什么 string.empty() 的计算结果为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42515050/

相关文章:

C++ 变量/对象和堆内存管理

c++ - Afxbeginthread 和 CreateThread 的区别

windows - Windows MSI 可以安装多个包吗?

c++ - 函数特化/重载规则示例

c++ - Encoding.Unicode.GetByteCount(str) 的 C++ 等价物?

Java 字符串 循环 数组 Null

c - 如何用C语言将两个字符串写入一个文件并对其进行排序?

javascript - 是否可以对字符串进行子串化,但隐藏整个字符串?

c++ - OpenGL wgl 中心文本

c++ - 使用 std::ofstream 写入文件比使用 std::cout 慢,然后将该输出重定向到日志文件