在C++里判断一个字符串是否为空,最标准的做法就是调用empty()成员函数。这个函数是std::string类自带的,语义清晰,执行效率高,也是各大编码规范里推荐的写法。不过很多初学者会把它和size()、length()混着用,甚至有人以为empty()是判断字符串是否包含空格或者是否为空指针,这些都是理解上的偏差。本文就来把empty()的用法彻底讲清楚,顺便说说char数组判空的正确处理方式。

c++ empty函数的基本用法
empty()是std::string的成员函数,函数原型非常简单:bool empty() const noexcept;。它没有任何参数,返回一个布尔值。当字符串中一个字符都没有时,返回true;只要字符串里有任意字符(哪怕是空格、换行符),就返回false。注意这里的语义:empty判断的是"长度是否为零",不是"内容是否为空白"。空格在C++里也是正常的字符,一个只包含一个空格的字符串,调用empty()得到的是false。
最基础的调用示例如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1 = ""; // 空字符串
string s2 = "hello"; // 非空字符串
string s3 = " "; // 只有一个空格,长度为1
cout << boolalpha;
cout << s1.empty() << endl; // 输出 true
cout << s2.empty() << endl; // 输出 false
cout << s3.empty() << endl; // 输出 false,空格也是字符
return 0;
}从实现角度看,empty()内部通常就是判断内部长度变量是否等于0,等价于s.size() == 0或者s.length() == 0。但由于它直接返回布尔值,不需要做整数比较,代码可读性更好,意图也更明确。标准规定它是noexcept的,也就是说它保证不抛出异常,可以放心在异常敏感的场景中使用。另外从C++11开始它被声明为const成员函数且编译器可自由优化,C++20之后还新增了constexpr版本,在编译期就能完成判断。
几种常见判空写法的对比
除了empty(),实际项目里还能见到好几种判空写法,它们的结果虽然一样,但在可读性和潜在风险上有差别。
第一种是长度比较:s.size() == 0。功能上没问题,但多了一步比较运算,而且阅读代码的人需要多想一层"size为零意味着什么"。第二种是直接和空串比较:s == ""。这种写法能工作,但会构造一个临时的空字符串对象参与比较(虽然编译器通常会优化掉),语义上不如empty()直白。第三种是下标访问判断:s[0] == '\0',这种写法风险最大,因为对空的std::string调用s[0]虽然标准规定返回空字符,但如果字符串本身处于无效状态,行为就可能出问题,而且这种写法把string当char数组对待,思路容易带偏。
// 三种写法对比
if (s.empty()) { /* 推荐:意图清晰 */ }
if (s.size() == 0) { /* 可行:稍显啰嗦 */ }
if (s == "") { /* 可行:语义不够直接 */ }综合来看,在任何需要判断std::string是否为空的场合,首选都是empty()。它不仅写起来短,而且是标准库作者明确提供给用户的语义化接口,代码审查时也不会引起歧义。如果一个团队规定统一的判空写法,empty()基本是没有争议的选择。
char数组判空为什么不能直接用empty
有一个常见的坑需要特别提醒:empty()是std::string的成员函数,只能作用在string对象上。如果拿到的是一个C风格的char数组或者const char*指针,直接调用ptr.empty()是编译不过的,因为原生指针和数组根本没有成员函数。这种情况下判断是否为空要分两层:一层是指针本身是否为空指针,另一层是指向的内容是否为空字符串。
#include <iostream>
#include <cstring>
using namespace std;
int main() {
const char* p = "";
// 先判空指针,再判字符串内容是否为空
if (p == nullptr) {
cout << "指针为空" << endl;
} else if (p[0] == '\0') {
cout << "字符串内容为空" << endl;
} else {
cout << "字符串非空" << endl;
}
return 0;
}判断C字符串内容是否为空,标准做法是看首字符是不是结束符'\0',即p[0] == '\0',也可以用strlen(p) == 0,不过strlen会遍历整个字符串统计长度,对非空的长字符串来说是不必要的开销,直接检查首字符更高效。还有一种更现代的思路是先把C字符串包装成std::string再判空,例如string(p).empty(),这种写法统一了代码风格,但会引入一次字符串拷贝,性能敏感的路径里要斟酌使用。
另外补充一个容易混淆的场景:从配置文件或用户输入读到的字符串,往往包含的是空白字符而不是真正的空。如果业务上认为"全空格也算空",那么empty()就不够用了,需要先做trim处理再判断。可以借助find_first_not_of实现:
// 判断字符串是否为空或者全是空白字符
bool isBlank(const string& s) {
return s.find_first_not_of(" \t\r\n") == string::npos;
}这个函数在empty()为true时同样返回true(找不到非空白字符),同时把全空格的情况也覆盖进去了,处理用户输入时非常实用。总结一下:std::string判空直接用empty(),C字符串判空先判指针再判首字符,空白判断则配合trim或find_first_not_of,分清这三种场景,字符串判空就不会再出错了。
c++ empty函数c++判断字符串为空c++ string修改时间:2026-09-10 14:26:41