Z
ZHANK
数组与字符串

std::string

string 拼接/查找/替换、与 C 字符串互转、string_view

std::string

C++ 的 std::string 是 C 字符串的现代化身——动态扩容、边界安全、功能丰富。永远优先用它而不是 char*

学完本章你将: 掌握 string 创建/拼接/比较、与 C 字符串互转、string_view。


基本操作

cpp
#include <iostream>
#include <string>

int main() {
    std::string s1 = "Hello";
    std::string s2("World");
    std::string s3 = s1 + " " + s2;  // "Hello World"

    // 长度
    std::cout << s3.length() << "\n";   // 11
    std::cout << s3.size() << "\n";     // 同上

    // 比较
    if (s1 == "Hello") std::cout << "相等\n";
    if (s1 < s2)       std::cout << "字典序\n";

    // 索引访问
    std::cout << s3[0] << "\n";         // 'H'(不检查边界)
    std::cout << s3.at(0) << "\n";      // 'H'(检查边界,安全)

    return 0;
}

与 C 字符串互转

cpp
// C 字符串 → std::string
const char *cstr = "hello";
std::string s = cstr;

// std::string → C 字符串
const char *back = s.c_str();  // 返回 const char*
// 注意:c_str() 返回的指针在 s 被修改后可能失效

string_view(C++17)—— 免拷贝的只读视图

cpp
#include <string_view>

// 不拷贝字符串,只记录指针 + 长度
void print(std::string_view sv) {
    std::cout << sv << "\n";
}

int main() {
    std::string s = "Hello World";
    print(s);              // 传 string ✓
    print("literal");      // 传字面量 ✓
    print(s.substr(0, 5)); // 传子串 ✓(不额外拷贝!)

    return 0;
}

💡 函数参数要读字符串时,优先用 std::string_view——可以兼容 string、char*、字面量,且零拷贝。