Skip to content

C++ 字符串

字符串是字符序列,用于表示文本。C++ 提供了两种处理字符串的方式:C 风格字符串和 C++ 标准库中的std::string类。

1. C 风格字符串

C 风格字符串是以空字符'\0'结尾的字符数组。

1.1 声明和初始化

cpp
#include <iostream>

int main() {
    // 声明并初始化 C 风格字符串
    char str1[] = "Hello";
    char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'};
    
    std::cout << str1 << std::endl;
    std::cout << str2 << std::endl;
    
    return 0;
}

1.2 字符串函数

C 风格字符串的操作函数定义在<cstring>头文件中。

函数描述示例
strlen(str)返回字符串的长度strlen("Hello") 返回 5
strcpy(dest, src)将 src 复制到 deststrcpy(dest, "Hello")
strcat(dest, src)将 src 追加到 deststrcat(dest, "World")
strcmp(str1, str2)比较两个字符串strcmp("Hello", "World")
strchr(str, ch)查找字符 ch 在 str 中的位置strchr("Hello", 'l')
strstr(str1, str2)查找 str2 在 str1 中的位置strstr("Hello", "ell")

示例

cpp
#include <iostream>
#include <cstring>

int main() {
    char str1[20] = "Hello";
    char str2[20] = "World";
    
    // strlen
    std::cout << "str1 的长度: " << strlen(str1) << std::endl;
    
    // strcpy
    char dest[20];
    strcpy(dest, str1);
    std::cout << "dest: " << dest << std::endl;
    
    // strcat
    strcat(str1, " ");
    strcat(str1, str2);
    std::cout << "str1: " << str1 << std::endl;
    
    // strcmp
    int result = strcmp("Hello", "World");
    std::cout << "strcmp 结果: " << result << std::endl;
    
    return 0;
}

2. std::string 类

std::string类是 C++ 标准库中提供的字符串类,使用起来更加方便和安全。

2.1 声明和初始化

cpp
#include <iostream>
#include <string>

int main() {
    // 声明并初始化 string
    std::string str1 = "Hello";
    std::string str2("World");
    std::string str3(5, 'a');  // "aaaaa"
    
    std::cout << str1 << std::endl;
    std::cout << str2 << std::endl;
    std::cout << str3 << std::endl;
    
    return 0;
}

2.2 字符串操作

2.2.1 拼接字符串

cpp
#include <iostream>
#include <string>

int main() {
    std::string str1 = "Hello";
    std::string str2 = "World";
    
    // 使用 + 运算符
    std::string str3 = str1 + " " + str2;
    std::cout << str3 << std::endl;
    
    // 使用 append 函数
    std::string str4 = str1;
    str4.append(" ");
    str4.append(str2);
    std::cout << str4 << std::endl;
    
    return 0;
}

2.2.2 获取字符串长度

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    
    // 使用 length 函数
    std::cout << "字符串长度: " << str.length() << std::endl;
    
    // 使用 size 函数
    std::cout << "字符串大小: " << str.size() << std::endl;
    
    return 0;
}

2.2.3 访问字符串中的字符

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    
    // 使用下标运算符
    std::cout << "第一个字符: " << str[0] << std::endl;
    
    // 使用 at 函数(会检查边界)
    std::cout << "第二个字符: " << str.at(1) << std::endl;
    
    // 修改字符
    str[0] = 'h';
    std::cout << str << std::endl;
    
    return 0;
}

2.2.4 查找子字符串

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    
    // 查找子字符串
    size_t pos = str.find("World");
    if (pos != std::string::npos) {
        std::cout << "找到 'World' 在位置: " << pos << std::endl;
    }
    
    return 0;
}

2.2.5 替换子字符串

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    
    // 替换子字符串
    str.replace(7, 5, "C++");
    std::cout << str << std::endl;
    
    return 0;
}

2.2.6 删除子字符串

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    
    // 删除子字符串
    str.erase(5, 2);  // 从位置 5 开始删除 2 个字符
    std::cout << str << std::endl;
    
    return 0;
}

2.2.7 提取子字符串

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    
    // 提取子字符串
    std::string substr = str.substr(7, 5);  // 从位置 7 开始提取 5 个字符
    std::cout << substr << std::endl;
    
    return 0;
}

2.2.8 比较字符串

cpp
#include <iostream>
#include <string>

int main() {
    std::string str1 = "Hello";
    std::string str2 = "World";
    
    // 使用比较运算符
    if (str1 == str2) {
        std::cout << "字符串相等" << std::endl;
    } else {
        std::cout << "字符串不相等" << std::endl;
    }
    
    // 使用 compare 函数
    int result = str1.compare(str2);
    if (result == 0) {
        std::cout << "字符串相等" << std::endl;
    } else if (result < 0) {
        std::cout << "str1 小于 str2" << std::endl;
    } else {
        std::cout << "str1 大于 str2" << std::endl;
    }
    
    return 0;
}

3. 字符串输入输出

3.1 输入字符串

cpp
#include <iostream>
#include <string>

int main() {
    std::string name;
    
    // 使用 cin(遇到空格停止)
    std::cout << "请输入你的名字: ";
    std::cin >> name;
    std::cout << "名字: " << name << std::endl;
    
    // 使用 getline(读取整行)
    std::cin.ignore();  // 清除缓冲区
    std::string full_name;
    std::cout << "请输入你的全名: ";
    std::getline(std::cin, full_name);
    std::cout << "全名: " << full_name << std::endl;
    
    return 0;
}

3.2 输出字符串

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    
    // 使用 cout
    std::cout << str << std::endl;
    
    // 使用 c_str 转换为 C 风格字符串
    printf("%s\n", str.c_str());
    
    return 0;
}

4. 字符串的转换

4.1 数字转字符串

cpp
#include <iostream>
#include <string>

int main() {
    int num = 123;
    double pi = 3.14;
    
    // 使用 to_string 函数
    std::string str1 = std::to_string(num);
    std::string str2 = std::to_string(pi);
    
    std::cout << str1 << std::endl;
    std::cout << str2 << std::endl;
    
    return 0;
}

4.2 字符串转数字

cpp
#include <iostream>
#include <string>

int main() {
    std::string str1 = "123";
    std::string str2 = "3.14";
    
    // 使用 stoi 函数
    int num = std::stoi(str1);
    std::cout << num << std::endl;
    
    // 使用 stod 函数
    double pi = std::stod(str2);
    std::cout << pi << std::endl;
    
    return 0;
}

5. 字符串的遍历

5.1 使用下标遍历

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    
    for (size_t i = 0; i < str.length(); i++) {
        std::cout << str[i] << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

5.2 使用范围 for 循环(C++11)

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    
    for (char ch : str) {
        std::cout << ch << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

5.3 使用迭代器

cpp
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    
    for (std::string::iterator it = str.begin(); it != str.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

6. 示例:综合运用

现在,让我们看一个综合运用各种字符串操作的例子:

cpp
#include <iostream>
#include <string>

int main() {
    // 声明和初始化 string
    std::cout << "声明和初始化 string:" << std::endl;
    std::string str1 = "Hello";
    std::string str2("World");
    std::cout << str1 << " " << str2 << std::endl;
    std::cout << std::endl;
    
    // 拼接字符串
    std::cout << "拼接字符串:" << std::endl;
    std::string str3 = str1 + " " + str2;
    std::cout << str3 << std::endl;
    std::cout << std::endl;
    
    // 获取字符串长度
    std::cout << "获取字符串长度:" << std::endl;
    std::cout << "字符串长度: " << str3.length() << std::endl;
    std::cout << std::endl;
    
    // 访问字符串中的字符
    std::cout << "访问字符串中的字符:" << std::endl;
    std::cout << "第一个字符: " << str3[0] << std::endl;
    std::cout << std::endl;
    
    // 查找子字符串
    std::cout << "查找子字符串:" << std::endl;
    size_t pos = str3.find("World");
    if (pos != std::string::npos) {
        std::cout << "找到 'World' 在位置: " << pos << std::endl;
    }
    std::cout << std::endl;
    
    // 替换子字符串
    std::cout << "替换子字符串:" << std::endl;
    str3.replace(7, 5, "C++");
    std::cout << str3 << std::endl;
    std::cout << std::endl;
    
    // 提取子字符串
    std::cout << "提取子字符串:" << std::endl;
    std::string substr = str3.substr(7, 3);
    std::cout << substr << std::endl;
    std::cout << std::endl;
    
    // 比较字符串
    std::cout << "比较字符串:" << std::endl;
    std::string str4 = "Hello";
    std::string str5 = "Hello";
    if (str4 == str5) {
        std::cout << "字符串相等" << std::endl;
    }
    std::cout << std::endl;
    
    // 数字转字符串
    std::cout << "数字转字符串:" << std::endl;
    int num = 123;
    std::string str_num = std::to_string(num);
    std::cout << str_num << std::endl;
    std::cout << std::endl;
    
    // 字符串转数字
    std::cout << "字符串转数字:" << std::endl;
    std::string str_num2 = "456";
    int num2 = std::stoi(str_num2);
    std::cout << num2 << std::endl;
    std::cout << std::endl;
    
    // 遍历字符串
    std::cout << "遍历字符串:" << std::endl;
    for (char ch : str3) {
        std::cout << ch << " ";
    }
    std::cout << std::endl;
    
    return 0;
}

小结

C++ 字符串包括:

  1. C 风格字符串

    • 以空字符'\0'结尾的字符数组
    • 使用<cstring>头文件中的函数操作
  2. std::string 类

    • C++ 标准库中的字符串类
    • 使用起来更加方便和安全
  3. 字符串操作

    • 拼接字符串:+运算符或append函数
    • 获取字符串长度:lengthsize函数
    • 访问字符串中的字符:下标运算符或at函数
    • 查找子字符串:find函数
    • 替换子字符串:replace函数
    • 删除子字符串:erase函数
    • 提取子字符串:substr函数
    • 比较字符串:比较运算符或compare函数
  4. 字符串输入输出

    • 输入:std::cinstd::getline
    • 输出:std::cout
  5. 字符串的转换

    • 数字转字符串:std::to_string
    • 字符串转数字:std::stoistd::stod
  6. 字符串的遍历

    • 使用下标遍历
    • 使用范围 for 循环(C++11)
    • 使用迭代器

关键概念:

  • C 风格字符串:以空字符结尾的字符数组
  • std::string 类:C++ 标准库中的字符串类
  • 字符串操作:拼接、查找、替换、删除、提取、比较等

掌握字符串是编写 C++ 程序的基础,在后续章节中,我们将学习 C++ 的指针。