c++字符串运算_连接、比较、输入输出等运算符重载应用

张开发
2026/4/7 2:10:53 15 分钟阅读

分享文章

c++字符串运算_连接、比较、输入输出等运算符重载应用
std::string的不能混用C字符串因仅重载于至少一个std::string操作数两const char*相加是非法指针运算。适合判等compare()支持子串比较和大小关系判定。为什么 std::string 的 连接不能和 C 风格字符串混用因为 是重载运算符只对至少一个操作数是 std::string 时才触发两个纯 const char* 相加会变成指针算术不是拼接。错误写法hello world → 编译失败C11 起或指针相加未定义行为正确写法必须让至少一边是 std::string比如 std::string(hello) world 或 hello std::string(world)注意hello ss 是 std::string合法但 s hello 也合法 —— 因为有非成员重载函数支持左值 std::string 和右值 C 字符串性能提示频繁用 拼接多个字符串会产生临时对象改用 或 std::ostringstream 更高效 和 compare() 哪个更适合字符串比较 足够日常使用但 compare() 提供更细粒度控制尤其在需要区分“小于/等于/大于”或子串比较时不可替代。 返回 bool语义清晰适合判等场景底层调用的正是 compare() 0compare() 返回 int负值表示小于0 表示相等正值表示大于 —— 适合做 std::sort 的谓词或 switch 判断子串比较如 s1.compare(pos1, len1, s2, pos2, len2) 完全不支持这种切片比对注意compare() 对空字符串、越界参数有明确定义如长度超出则取到末尾但传错 pos 仍会抛 std::out_of_range用 std::cin 读字符串为什么停在空格怎么读整行operator 默认以空白字符空格、制表、换行为分隔符所以只会提取第一个单词要读完整行必须用 std::getline()。std::cin s跳过开头空白读到下一个空白为止s 不含空格也不含换行符std::getline(std::cin, s)读到换行符为止并丢弃该换行符s 包含中间所有字符包括空格但不含换行常见坑先用 再用 getline()缓冲区残留的换行会被 getline() 立即读走导致“跳过输入”——需在中间加 std::cin.ignore()安全起见若不确定输入格式优先用 getline()再用 std::stringstream 解析内部字段std::string 的隐式转换和构造函数容易引发什么歧义从 C 字符串构造 std::string 是隐式的但某些重载函数签名相近时编译器可能选错函数尤其是涉及 char、int 或自定义类型时。立即学习“C免费学习笔记深入”典型问题func(hello) 若 func 有 void func(const char*) 和 void func(std::string) 两个重载两者都可行但优先匹配 const char*无转换更隐蔽的是构造函数如 std::string s(5, a) 是重复构造但 std::string s(5) 会尝试用 char(5) 初始化结果是含一个 ASCII ENQ 字符的字符串不是长度为 5 的空串C11 后推荐用花括号初始化防误std::string s{5, a} 明确调用 initializer_list 构造而 std::string s{5} 编译失败无匹配与 std::string_view 混用时也要小心func(std::string_view{abc}) 和 func(abc) 可能触发不同重载因后者可转 std::string 或 std::string_view字符串运算看似简单但每个重载背后都有隐含的类型匹配规则和生命周期约束最常出问题的地方不在语法而在你没意识到某次“自动转换”其实悄悄新建了临时对象或者某个 compare() 调用里漏写了长度参数导致越界截断。

更多文章