为什么string.empty()在字符串包含一个值时评估为true

Why is string.empty() evaluating to true when the string contains a value?

本文关键字:评估 true 包含一 字符串 empty string 为什么      更新时间:2023-10-16

简介

我正在使用MFC制作一个应用程序,该应用程序具有用于对电子表格中数据进行排序的对话框。对话框包含几个控件,包括编辑框。当用户单击确定按钮时,对话框应检索其首选项并关闭。

essue

从对话框获取信息时,包含信息的字符串始终为空注册。我在字符串所在的位置设置了一个断点,并且值似乎可以找到,但是当我调用任何功能以确定字符串的大小时,它显示为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 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中使用的本机字符编码。