题目

编写高效实用的字符串清理函数: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