以下是 C++ C风格字符串学习笔记教程,包含基础概念、常用操作、示例代码和详细注释:

C++ C风格字符串学习笔记

一、C风格字符串的本质

C风格字符串实际上是字符数组,以空字符 '\0' 结尾。
例如:"Hello" 存储为 {'H', 'e', 'l', 'l', 'o', '\0'}

二、字符串的定义与初始化

  1. 字符数组方式

    char str1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};  // 显式添加 '\0'
    char str2[] = "Hello";  // 自动添加 '\0',数组长度为6
    
  2. 指针方式

    const char* str3 = "World";  // 指向字符串常量(只读)
    

注意

  • 字符数组可修改内容,指针指向的字符串常量不可修改。
  • 字符串长度 = 字符数 + 1(包含 '\0')。

三、字符串输入输出

  1. 输出

    cout << str2;  // 输出: Hello
    
  2. 输入

    char name[20];
    cin >> name;  // 遇到空格或换行停止
    cin.getline(name, 20);  // 读取整行(包含空格)
    

四、常用字符串处理函数

需包含头文件 <cstring>

  1. 计算字符串长度

    strlen(str);  // 返回字符串长度(不包含 '\0')
    
  2. 字符串复制

    char dest[10];
    strcpy(dest, "Copy");  // 复制内容到 dest
    strncpy(dest, "LongString", 5);  // 复制前5个字符,需手动补 '\0'
    
  3. 字符串拼接

    char src[20] = "Hello";
    strcat(src, " World");  // 拼接后 src 为 "Hello World"
    strncat(src, "!", 1);   // 拼接1个字符
    
  4. 字符串比较

    strcmp("A", "B");  // 返回负数(-1)
    strcmp("A", "A");  // 返回0
    strcmp("B", "A");  // 返回正数(1)
    
  5. 字符串查找

    char* pos = strstr("Hello", "ll");  // 返回 "ll" 的首地址
    

五、示例代码:字符串操作演示

#include <iostream>
#include <cstring>  // 包含C风格字符串函数库
using namespace std;

int main() {
    // 1. 定义与初始化
    char str1[20] = "Hello";
    const char* str2 = "World";
    
    // 2. 计算长度
    cout << "Length of str1: " << strlen(str1) << endl;  // 输出: 5
    
    // 3. 字符串复制
    char copy[20];
    strcpy(copy, str1);
    cout << "Copied: " << copy << endl;  // 输出: Hello
    
    // 4. 字符串拼接
    strcat(copy, " ");
    strcat(copy, str2);
    cout << "Concatenated: " << copy << endl;  // 输出: Hello World
    
    // 5. 字符串比较
    if (strcmp(str1, "Hello") == 0) {
        cout << "str1 equals 'Hello'" << endl;
    }
    
    // 6. 字符串查找
    char* pos = strstr(copy, "World");
    if (pos != nullptr) {
        cout << "Found 'World' at position: " << pos - copy << endl;  // 输出: 6
    }
    
    return 0;
}

六、注意事项

  1. 内存溢出风险

    char small[3];
    strcpy(small, "LongString");  // 危险!会导致内存溢出
    

    解决方法:使用 strncpy 并手动补 '\0'

  2. 字符串常量不可修改

    const char* msg = "Error";
    msg[0] = 'W';  // 错误!常量不可修改
    
  3. 输入长度限制

    char input[10];
    cin.getline(input, 10);  // 最多读取9个字符,留一个位置给 '\0'
    

七、总结

C风格字符串是C++的基础功能,适合性能敏感场景。但需注意手动管理内存和空字符。
后续可学习 std::string 类(C++标准库),它更安全、易用,支持自动内存管理。

希望这份教程能帮助你掌握C风格字符串!如果有疑问,欢迎随时提问~ 😊

1 条评论

  • @ 2025-7-27 13:40:33

    以下是为你生成的 C风格字符串相关成员函数 学习笔记教程,包含基础概念、常用函数、示例代码和详细注释:

    C++ C风格字符串成员函数学习笔记

    一、C风格字符串概述

    C风格字符串是以空字符 '\0' 结尾的字符数组,在 <cstring> 头文件中提供了一系列处理函数。
    例如:"Hello" 实际存储为 {'H', 'e', 'l', 'l', 'o', '\0'}

    二、常用字符串处理函数

    以下函数均需包含头文件 <cstring>

    1. 字符串长度计算

    size_t strlen(const char* str);
    
    • 功能:返回字符串长度(不包含 '\0')。
    • 示例
      const char* str = "Hello";
      cout << strlen(str);  // 输出: 5
      

    2. 字符串复制

    char* strcpy(char* dest, const char* src);
    char* strncpy(char* dest, const char* src, size_t n);
    
    • 功能
      • strcpy:复制整个字符串。
      • strncpy:复制最多 n 个字符,需手动补 '\0'
    • 示例
      char dest[10];
      strcpy(dest, "Hello");        // dest = "Hello"
      strncpy(dest, "ABC", 2);      // dest = "AB"(未补 '\0',可能导致问题)
      dest[2] = '\0';               // 手动补 '\0'
      

    3. 字符串拼接

    char* strcat(char* dest, const char* src);
    char* strncat(char* dest, const char* src, size_t n);
    
    • 功能
      • strcat:将 src 拼接到 dest 末尾。
      • strncat:拼接最多 n 个字符,自动补 '\0'
    • 示例
      char dest[20] = "Hello";
      strcat(dest, " World");       // dest = "Hello World"
      strncat(dest, "!", 1);        // dest = "Hello World!"
      

    4. 字符串比较

    int strcmp(const char* s1, const char* s2);
    int strncmp(const char* s1, const char* s2, size_t n);
    
    • 功能
      • 按字典序比较字符串,返回值:
        • < 0s1 < s2
        • 0s1 == s2
        • > 0s1 > s2
      • strncmp 只比较前 n 个字符。
    • 示例
      strcmp("A", "B");  // 返回 -1
      strcmp("A", "A");  // 返回 0
      strncmp("ABC", "ABD", 2);  // 返回 0(前2个字符相同)
      

    5. 字符串查找

    char* strstr(const char* haystack, const char* needle);
    char* strchr(const char* str, int c);
    
    • 功能
      • strstr:查找子串 needle,返回首次出现的位置指针。
      • strchr:查找字符 c,返回首次出现的位置指针。
    • 示例
      const char* text = "Hello World";
      char* pos = strstr(text, "World");  // pos 指向 "World" 的首地址
      char* p = strchr(text, 'o');        // p 指向第一个 'o'
      

    6. 字符串分割

    char* strtok(char* str, const char* delimiters);
    
    • 功能:将字符串按分隔符 delimiters 分割为多个token。
    • 示例
      char str[] = "Hello,World,C++";
      char* token = strtok(str, ",");  // token = "Hello"
      while (token != nullptr) {
          cout << token << endl;
          token = strtok(nullptr, ",");  // 继续分割剩余部分
      }
      // 输出:
      // Hello
      // World
      // C++
      

    三、示例代码:综合演示

    #include <iostream>
    #include <cstring>  // 包含C风格字符串函数库
    using namespace std;
    
    int main() {
        // 1. 字符串长度
        const char* str = "Hello";
        cout << "Length: " << strlen(str) << endl;  // 输出: 5
    
        // 2. 字符串复制与拼接
        char dest[20];
        strcpy(dest, "Hello");
        strcat(dest, " ");
        strncat(dest, "World", 3);  // 拼接 "Wor"
        cout << "Dest: " << dest << endl;  // 输出: Hello Wor
    
        // 3. 字符串比较
        if (strcmp(dest, "Hello Wor") == 0) {
            cout << "Strings are equal." << endl;
        }
    
        // 4. 字符串查找
        char* pos = strstr(dest, "Wor");
        if (pos != nullptr) {
            cout << "Found at position: " << (pos - dest) << endl;  // 输出: 6
        }
    
        // 5. 字符串分割
        char text[] = "apple,banana,orange";
        char* token = strtok(text, ",");
        while (token != nullptr) {
            cout << "Token: " << token << endl;
            token = strtok(nullptr, ",");
        }
        // 输出:
        // Token: apple
        // Token: banana
        // Token: orange
    
        return 0;
    }
    

    四、注意事项

    1. 内存安全

      • 使用 strncpystrncat 避免缓冲区溢出。
      • 确保目标数组足够大,能容纳所有字符(包括 '\0')。
    2. 字符串常量不可修改

      const char* str = "Hello";
      str[0] = 'J';  // 错误!常量不可修改
      
    3. strtok 的副作用

      • strtok 会修改原字符串(用 '\0' 替换分隔符)。
      • 线程不安全,如需多线程使用,可考虑 strtok_r

    五、总结

    C风格字符串函数虽然灵活,但需手动管理内存和空字符,容易出错。
    建议在实际开发中优先使用 C++ 的 std::string 类,它更安全、易用,支持自动内存管理。

    希望这份教程能帮助你掌握C风格字符串函数!如有疑问,欢迎提问~ 😊

    • 1