最常用且可控的去首尾空格方法是组合使用 find_first_not_of 和 find_last_not_of 配合 substr 或 erase,需正确处理全空白字符串和边界条件,避免越界或未删净。
标准库没直接叫 trim 的函数,但组合 find_first_not_of 和 erase 是最常用、最可控的方式。它只删首尾,不碰中间空格,也兼容 C++11 及以上。
常见错误是只调一次 erase 或漏掉右边界判断,导致越界或没删干净。
find_first_not_of(" \t\n\r\f\v") 找第一个非空白位置(注意包含所有常见空白符)find_last_not_of(" \t\n\r\f\v") 找最后一个非空白位置pos != std::string::npos),再用 substr 或两次 erase 截取substr 会抛 std::out_of_range
std::string trim(const std::string& s) {
size_t l = s.find_first_not_of(" \t\n\r\f\v");
if (l == std::string::npos) return ""; // 全空白或空串
size_t r = s.find_last_not_of(" \t\n\r\f\v");
return s.substr(l, r - l + 1);
}如果你项目已用 Boost,boost::algorithm::trim 确实一行搞定,但它默认只认 ASCII 空格和制表符,对 \v(垂直制表)或 Unicode BOM 类空白不敏感;且引入 Boost 会增加编译依赖和二进制体积。
更关键的是:它修改原字符串(trim(s) 是 in-place),而很多人其实需要 const 输入 + 新字符串返回——这时反而要写 auto t = s; trim(t);,多一次拷贝。
std::wstring)时,Boost 版本要换函数名(trim_copy 等),不如自己封装模板有人用 std::isspace(c, std::locale()) 判断空白,看似“更标准”,但实际容易出问题:当前 locale 可能将非预期字符(比如某些中文全角空格、Unicode Zs 类分隔符)判为空白,而 find_first_not_of 用字面字符串则行为完全确定。
std::isspace
std::locale("") 而非默认构造,否则行为未定义纯 std::string 存 UTF-8 时,上述 trim 函数仍可安全使用——因 UTF-8 的空白字符(如 U+0020、U+0009)仍是单字节,不会切开多字节序列。但如果你要删的是 Unicode 空白(如 U+3000 全角空格),就必须先解码为 code poi

char 序列。
utf8cpp 解码后遍历 uint32_t,而不是在 char 层面硬匹配std::regex)做 trim:启动开销大、易写错、C++11 regex 实现质量参差真正容易被忽略的是:trim 后的字符串可能仍含不可见控制字符(如 \0 或 \x0B),它们不在常用空白集中,但会影响后续解析。是否过滤,得看你的协议或格式规范要求。