题目
编写高效实用的字符串清理函数:trimLeft(去除左侧空白)、trimRight(去除右侧空白)以及 trim(同时去除首尾空白)。函数支持空格、制表符 \t、换行符 \r, \n 等常见空白符;利用 find_first_not_of 与 find_last_not_of 高效定位有效内容区间,并处理纯空白字符串的边界防御。
输入格式:无需外部输入(内置含空格、制表符与换行的测试串)。
输出格式:分别输出左修剪、右修剪以及完全修剪后的结果及字符长度。
数据范围与约定:字符串处理与边界安全性。
思路与算法
1. 空白字符全集
标准空白符不仅有空格,还包括 " \t\n\r\f\v"。使用集合匹配能够彻底清理来自 Windows/Linux 跨平台换行差异产生的换行符。
2. find_first_not_of 语义
直接寻找第一个非空白字符的下标 start;若整个字符串全是空白字符,该方法返回 std::string::npos,此时修剪结果为空串 ""。
3. 原地修改 vs 返回新串
使用 str.erase() 可以原地修改原字符串,无需额外内存分配;亦可结合 std::string_view 返回零拷贝的修剪视图。
完整程序
#include <iostream>
#include <string>
const std::string WHITESPACE = " \t\n\r\f\v";
std::string trimLeft(const std::string& s) {
size_t start = s.find_first_not_of(WHITESPACE);
return (start == std::string::npos) ? "" : s.substr(start);
}
std::string trimRight(const std::string& s) {
size_t end = s.find_last_not_of(WHITESPACE);
return (end == std::string::npos) ? "" : s.substr(0, end + 1);
}
std::string trim(const std::string& s) {
size_t start = s.find_first_not_of(WHITESPACE);
if (start == std::string::npos) return "";
size_t end = s.find_last_not_of(WHITESPACE);
return s.substr(start, end - start + 1);
}
int main() {
std::string raw = " \t\t \r Hello C++ World! \n \t ";
std::string lTrimmed = trimLeft(raw);
std::string rTrimmed = trimRight(raw);
std::string fullTrimmed = trim(raw);
std::cout << "原始串内容: [\"" << raw << "\"] 长度: " << raw.length() << "\n";
std::cout << "左修剪结果: [\"" << lTrimmed << "\"] 长度: " << lTrimmed.length() << "\n";
std::cout << "右修剪结果: [\"" << rTrimmed << "\"] 长度: " << rTrimmed.length() << "\n";
std::cout << "完全修剪结果: [\"" << fullTrimmed << "\"] 长度: " << fullTrimmed.length() << "\n";
// 全空格极端边界测试
std::string emptySpaces = " \t\t ";
std::cout << "全空白串修剪: [\"" << trim(emptySpaces) << "\"] 长度: " << trim(emptySpaces).length() << "\n";
return 0;
}运行示例
输出:
原始串内容: ["
Hello C++ World!
"] 长度: 29
左修剪结果: ["Hello C++ World!
"] 长度: 22
右修剪结果: ["
Hello C++ World!"] 长度: 23
完全修剪结果: ["Hello C++ World!"] 长度: 16
全空白串修剪: [""] 长度: 0