如何检查std :: string是否已设置?

90

如果使用 char*,可以将其初始化为 NULL,然后通过比较来检查是否已设置。如何为 std::string 做同样的事情?怎么检查字符串是否被设置了?

编辑: 如果我设置的字符串也为空怎么办?我需要使用额外的标志来检查 std::string 是否已设置吗?


1
你为什么想要这种行为? - jfs
6个回答

148

使用empty()函数:

std::string s;

if (s.empty())
    // nothing in s

5
如果字符串是 "",会发生什么? - nakiya
6
@nakiya说:“这是空的。std::string不是指针,你不能将null赋值给它。” - GManNickG
所以基本上,如果我分配的字符串可以是任何东西,包括 "",我必须保留另一个 bool 或其他东西来检查它是否已设置。:S - nakiya
1
@nakiya:要么像Michael Burr建议的那样使用指向std::string的指针,要么使用提供此类功能的包装器(如Boost.Optional)。 - James McNellis
1
@nakiya 自 C++17 开始,有 std::optional 可以用作包装器来表示未实例化的字符串。就像 James McNellis 已经建议的 Boost 中的等效方法一样。 - stackprotector

27

正如其他回答所指出的那样,std::string 没有关于其值的“空值”概念。如果使用空字符串作为这种值不够好(即,您需要区分没有字符和没有值的字符串),则可以使用 std::string* 并根据需要将其设置为 NULL 或有效的 std::string 实例。

您可能希望使用某种智能指针类型(例如 boost::scoped_ptr)来帮助管理将指针设置为的任何 std::string 对象的生命周期。


6
你还可以使用 boost::optional<std::string>。模板 boost::optional<T> 的存在恰恰是为了支持那些天生没有“空值性”的类型的情况。 - MSalters

24

你无法像测试指针是否为NULL那样测试std::string对象是否为空。

std::string对象总是被初始化并且始终包含一个字符串;默认情况下它的内容是空字符串("")。

你可以使用s.size() == 0或者s.empty()来测试是否为空。


5

对于 std::string 来说,不存在“未设置”状态,它总是被设置成某个值。


2

std::string的默认构造函数总是返回一个设置为空字符串的对象。


11
为了清晰明了, 默认构造函数返回一个空字符串,std::string() == std::string("") - SingleNegationElimination

0

我认为你无法通过std :: string类来判断。但是,如果您确实需要此信息,则可以从std :: string派生一个类,并使得派生类能够判断它是否自构造(或某个其他任意时间)以来已更改。或者最好编写一个包装std :: string的新类,因为由于缺少基类虚析构函数,派生自std :: string可能不是一个好主意。这可能需要更多工作,但是为了获得最佳解决方案,通常需要更多的工作。

当然,您始终可以假设如果std :: string包含除“”之外的内容,则已经“设置”,但这不会检测是否手动将其设置为“”。


1
从标准库容器公开派生通常是一个不好的想法,因为它们没有虚析构函数。更好的方法是将std::string封装为成员变量。 - James McNellis
@James McNellis:我理解你的观点。我会将其纳入答案中。 - PatrickV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接