• C++
  • C++ `string` 的基础教程

  • @ 2025-6-18 18:37:49

以下是一个关于 C++ string 的基础教程,采用通俗易懂的方式讲解,并使用 using namespace std; 简化代码:

1. 什么是 string

string 是 C++ 标准库中用于处理文本的类,位于 <string> 头文件中。它比 C 风格的字符数组(如 char[])更安全、更方便。

2. 基本用法

2.1 包含头文件与命名空间

#include <iostream>
#include <string>  // 包含 string 库
using namespace std;  // 避免每次都写 std::

int main() {
    // 后续代码...
    return 0;
}

2.2 声明与初始化

string s1;  // 空字符串
string s2 = "Hello";  // 直接初始化
string s3("World");  // 构造函数初始化
string s4 = s2 + " " + s3;  // 拼接字符串 -> "Hello World"
string s5(5, 'a');  // 重复字符 -> "aaaaa"

3. 字符串操作

3.1 输入输出

string name;
cout << "Enter your name: ";
cin >> name;  // 读取到空格为止
getline(cin, name);  // 读取整行(含空格)

cout << "Hello, " << name << "!";

3.2 拼接

string s1 = "Hello";
string s2 = "World";
string s3 = s1 + " " + s2;  // "Hello World"
s1 += "!";  // s1 变为 "Hello!"

3.3 长度与空判断

string s = "Hello";
int len = s.length();  // 或 s.size(),结果为 5
bool isEmpty = s.empty();  // false

if (s == "") {  // 等价于 s.empty()
    cout << "String is empty";
}

3.4 访问字符

string s = "Hello";
char first = s[0];  // 'H'(不检查越界)
char last = s.at(s.length() - 1);  // 'o'(检查越界)

// 修改字符
s[0] = 'J';  // s 变为 "Jello"

4. 常用函数

4.1 查找

string s = "Hello World";
size_t pos = s.find("World");  // 位置 6(从 0 开始)
if (pos != string::npos) {  // npos 表示未找到
    cout << "Found at position " << pos;
}

// 从指定位置开始查找
size_t pos2 = s.find("l", 3);  // 位置 3

4.2 子串

string s = "Hello World";
string sub = s.substr(6, 5);  // 从位置 6 开始,长度 5 -> "World"
string sub2 = s.substr(6);  // 从位置 6 到末尾 -> "World"

4.3 替换与插入

string s = "Hello";
s.replace(1, 3, "i");  // 从位置 1 开始的 3 个字符替换为 "i" -> "Hi"

s.insert(1, "ello");  // 在位置 1 插入字符串 -> "Hello"

4.4 删除

string s = "Hello World";
s.erase(5);  // 删除从位置 5 到末尾 -> "Hello"
s.erase(1, 3);  // 从位置 1 开始删除 3 个字符 -> "Ho"
s.clear();  // 清空字符串

5. 与 C 风格字符串的转换

5.1 stringconst char*

string s = "Hello";
const char* cstr = s.c_str();  // 用于需要 C 风格字符串的函数

5.2 const char*string

const char* cstr = "Hello";
string s = cstr;  // 自动转换

6. 示例程序

#include <iostream>
#include <string>
using namespace std;

int main() {
    string name;
    cout << "Enter your name: ";
    getline(cin, name);

    if (!name.empty()) {
        string greeting = "Hello, " + name + "!";
        cout << greeting << endl;
        
        // 反转字符串(练习)
        string reversed = "";
        for (int i = name.length() - 1; i >= 0; i--) {
            reversed += name[i];
        }
        cout << "Reversed: " << reversed << endl;
    }

    return 0;
}

7. 注意事项

  1. string 是类:它会自动管理内存,无需手动释放。
  2. 性能:频繁拼接字符串时,使用 stringstream 更高效。
  3. 越界风险[] 不检查越界,at() 会抛出异常。

总结

string 是 C++ 中处理文本的首选方式,它提供了丰富的功能和安全性。通过 using namespace std; 可以简化代码书写,但在大型项目中建议慎用,避免命名冲突。

2 条评论

  • @ 2025-6-18 18:45:38

    以下是关于 C++ 中 字符处理函数(如 tolowertoupper 等)的基础教程,采用通俗易懂的方式讲解,并使用 using namespace std;

    1. 字符处理函数概述

    C++ 提供了一系列用于处理单个字符的函数,位于 <cctype> 头文件中。这些函数可用于判断字符类型(如是否为字母、数字)或转换字符大小写。
    特点

    • 输入输出均为 int 类型(实际为 char 的 ASCII 值)。
    • 处理的字符必须是 ASCII 范围内 的值,否则行为未定义。

    2. 常用字符处理函数

    2.1 大小写转换

    函数 功能 示例
    tolower(int c) 将字符转为小写(非字母不变) tolower('A')'a'
    tolower('1')'1'
    toupper(int c) 将字符转为大写(非字母不变) toupper('b')'B'
    toupper('$')'$'

    示例代码

    #include <iostream>
    #include <cctype>  // 包含字符处理函数
    using namespace std;
    
    int main() {
        char c1 = 'A';
        char c2 = tolower(c1);  // 'a'
        
        char c3 = '7';
        char c4 = toupper(c3);  // '7'(非字母不变)
        
        cout << c2 << ", " << c4 << endl;  // 输出: a, 7
        return 0;
    }
    

    2.2 字符类型判断

    函数 功能 返回值(bool
    isalpha(int c) 判断是否为字母(a-z, A-Z) 是 → true,否 → false
    isdigit(int c) 判断是否为数字(0-9)
    isalnum(int c) 判断是否为字母或数字(isalphaisdigit
    isspace(int c) 判断是否为空白字符(空格、制表符、换行符等)
    ispunct(int c) 判断是否为标点符号(非字母、数字、空白的字符)
    isupper(int c) 判断是否为大写字母(A-Z)
    islower(int c) 判断是否为小写字母(a-z)

    示例代码

    char c = '!';
    
    cout << isalpha(c) << endl;   // 0(false)
    cout << ispunct(c) << endl;   // 1(true)
    cout << isspace('\t') << endl; // 1(true,制表符是空白字符)
    

    3. 注意事项

    1. 输入类型为 int
      函数参数为 int,但实际处理的是 char 的 ASCII 值。若传入超出 ASCII 范围的整数,结果未定义。

    2. 返回值为 int

      • tolower/toupper 的返回值需显式转换为 char
        char c = 'A';
        char lower = static_cast<char>(tolower(c));  // 推荐显式转换
        
      • 直接赋值可能导致隐式转换(如 intchar),但在 ASCII 范围内通常安全。
    3. 国际化限制
      这些函数仅适用于 ASCII 字符集。对于 Unicode 或多字节字符(如中文),需使用 <locale><codecvt> 库。

    4. 实际应用场景

    4.1 字符串大小写转换

    #include <iostream>
    #include <cctype>
    #include <string>
    using namespace std;
    
    int main() {
        string str = "Hello, World!";
        
        // 转为小写
        for (char& c : str) {
            c = tolower(c);
        }
        cout << str << endl;  // 输出: hello, world!
        
        // 转为大写
        for (char& c : str) {
            c = toupper(c);
        }
        cout << str << endl;  // 输出: HELLO, WORLD!
        
        return 0;
    }
    

    4.2 过滤非数字字符

    string input = "a1b2c3";
    string digits;
    
    for (char c : input) {
        if (isdigit(c)) {
            digits += c;
        }
    }
    
    cout << digits << endl;  // 输出: 123
    

    4.3 统计各类字符数量

    string text = "Hello, 123!";
    int letters = 0, numbers = 0, spaces = 0, puncts = 0;
    
    for (char c : text) {
        if (isalpha(c)) letters++;
        else if (isdigit(c)) numbers++;
        else if (isspace(c)) spaces++;
        else if (ispunct(c)) puncts++;
    }
    
    cout << "Letters: " << letters << endl;    // 5
    cout << "Numbers: " << numbers << endl;    // 3
    cout << "Spaces: " << spaces << endl;      // 1
    cout << "Punctuation: " << puncts << endl; // 1
    

    5. 与 C 语言的区别

    C++ 的字符处理函数与 C 语言基本相同,但 C++ 提供了更安全的类型检查。例如:

    • C++ 中 tolower 的参数必须是可隐式转换为 int 的类型(如 char),而 C 语言允许传递任意类型。

    总结

    字符处理函数(如 tolowerisalpha)是 C++ 中处理文本的基础工具,适用于简单的字符转换和判断。使用时需注意:

    1. 包含 <cctype> 头文件。
    2. 输入输出为 int 类型,处理 ASCII 范围内的字符。
    3. 对于复杂文本处理(如国际化),需使用更高级的库。

    通过这些函数,你可以轻松实现字符串的大小写转换、字符类型过滤等操作。

    • @ 2025-6-18 18:38:49

      以下是使用表格形式整理的 C++ string 常用用法,包含示例代码和说明:

      C++ string 用法速查表

      操作 代码示例 说明
      声明与初始化
      空字符串 string s; 创建空字符串,长度为 0。
      直接赋值 string s = "Hello"; 用 C 风格字符串初始化。
      构造函数 string s("World"); 同上,使用构造函数语法。
      重复字符 string s(5, 'a'); 创建包含 5 个 'a' 的字符串:"aaaaa"
      拷贝初始化 string s2 = s1; 复制另一个字符串。
      访问与修改
      通过下标访问 char c = s[0]; 获取第 0 个字符(不检查越界)。
      通过 at() 访问 char c = s.at(0); 同上,但越界时抛出 out_of_range 异常。
      修改字符 s[0] = 'H'; 将第 0 个字符改为 'H'
      长度与空判断
      获取长度 int len = s.length(); 返回字符串长度(字符数)。
      空字符串检查 bool empty = s.empty(); 等价于 s.length() == 0
      拼接与追加
      加号拼接 string s3 = s1 + " " + s2; 返回拼接后的新字符串。
      追加字符串 s1 += " World"; 在原字符串末尾追加内容。
      追加字符 s1.push_back('!'); 在原字符串末尾添加一个字符。
      查找与替换
      查找子串 size_t pos = s.find("World"); 返回子串首次出现的位置,未找到返回 string::npos
      从指定位置查找 s.find("l", 3); 从位置 3 开始查找 'l'
      替换子串 s.replace(1, 3, "i"); 将位置 1 开始的 3 个字符替换为 "i"
      子串与插入
      获取子串 string sub = s.substr(6, 5); 从位置 6 开始截取长度为 5 的子串。
      插入字符串 s.insert(1, "ello"); 在位置 1 插入字符串。
      删除与清空
      删除部分内容 s.erase(5); 删除从位置 5 到末尾的所有字符。
      删除指定范围 s.erase(1, 3); 删除从位置 1 开始的 3 个字符。
      清空字符串 s.clear(); 清空字符串内容,长度变为 0。
      比较
      相等判断 if (s1 == s2) {...} 按字典序比较,返回 bool
      字典序比较 int cmp = s1.compare(s2); 返回 0(相等)、负数(s1 < s2)或正数(s1 > s2)。
      转换
      转为 C 风格字符串 const char* cstr = s.c_str(); 用于需要 const char* 的函数(如 printf)。
      数字转字符串 string num = to_string(123); 将整数/浮点数转为字符串。
      字符串转数字 int n = stoi("123"); 支持 stoi(整数)、stod(双精度)等。

      示例代码

      #include <iostream>
      #include <string>
      using namespace std;
      
      int main() {
          // 初始化
          string s1 = "Hello";
          string s2(5, 'a');  // "aaaaa"
          
          // 拼接
          string s3 = s1 + " " + s2;  // "Hello aaaaa"
          
          // 修改
          s3[6] = 'b';  // "Hello baaaa"
          
          // 查找
          size_t pos = s3.find("baa");  // 位置 6
          
          // 子串
          string sub = s3.substr(6, 3);  // "baa"
          
          // 替换
          s3.replace(6, 3, "BAA");  // "Hello BAAaaa"
          
          // 输出
          cout << "Length: " << s3.length() << endl;  // 12
          cout << "s3: " << s3 << endl;  // "Hello BAAaaa"
          
          return 0;
      }
      

      注意事项

      1. 越界风险[] 不检查越界,at() 更安全但性能略低。
      2. string::npos:查找失败时返回的特殊值,通常为 size_t 的最大值。
      3. 性能优化:频繁拼接时建议用 stringstreamreserve() 预分配空间。

      通过这张表格,你可以快速掌握 string 的核心用法。

      • 1