C++字符串

C++ 字符串教程涵盖了如何在 C++ 中使用字符串,包括 C 风格的字符串和 C++ 标准库提供的 std::string 类。这里我将详细介绍 C++ 字符串的使用,涵盖其基本操作、常见函数和一些进阶技巧。

1. C 风格字符串(C-Style Strings)

C 风格字符串其实是以 \0 结尾的字符数组。由于 C++ 继承了 C 语言的特性,C 风格字符串仍然被广泛使用。

示例:
 #include <iostream>
 using namespace std;
 ​
 int main() {
     // C 风格字符串:字符数组
     char str[] = "Hello, World!";
     cout << str << endl;  // 输出: Hello, World!
     return 0;
 }
  • 定义和初始化

     char str[] = "Hello";  // 字符数组,包含 6 个字符(包括 '\0')

  • 常见操作

    • 使用

      strlen()

      来获取字符串长度:

       #include <cstring>
       cout << "长度: " << strlen(str) << endl;

    • 使用

       strcpy()

      复制字符串:

       char dest[20];
       strcpy(dest, str);  // 复制 str 到 dest
       cout << dest << endl;

  • 优点与缺点

    • 优点:C 风格字符串更接近底层,内存开销小。

    • 缺点:容易出错,特别是在处理字符串大小时(如 strcpy 时没有考虑数组大小)。


2. C++ 字符串类(std::string

在 C++ 中,std::string 是一个标准库类,提供了很多方便的字符串操作函数。它比 C 风格字符串更为安全和方便。

示例:
 #include <iostream>
 #include <string>  // 需要包含 string 头文件
 using namespace std;
 ​
 int main() {
     string str = "Hello, World!";  // 使用 std::string 定义字符串
     cout << str << endl;  // 输出: Hello, World!
     return 0;
 }
基本操作:
  • 定义和初始化

     string str1 = "Hello";  // 使用字符串字面量初始化
     string str2(5, 'a');     // 定义一个包含 5 个 'a' 的字符串
     string str3;             // 空字符串

  • 连接字符串

     string str1 = "Hello";
     string str2 = "World";
     string str3 = str1 + ", " + str2 + "!";  // 使用 + 进行字符串连接
     cout << str3 << endl;  // 输出: Hello, World!

  • 获取字符串长度

     string str = "Hello";
     cout << "长度: " << str.length() << endl;  // 输出: 5

  • 访问单个字符

     string str = "Hello";
     cout << str[1] << endl;  // 输出: e

  • 修改字符串

     string str = "Hello";
     str[0] = 'h';  // 修改第一个字符
     cout << str << endl;  // 输出: hello

  • 字符串比较

     string str1 = "apple";
     string str2 = "banana";
     ​
     if (str1 == str2) {
         cout << "字符串相等" << endl;
     } else {
         cout << "字符串不相等" << endl;  // 输出: 字符串不相等
     }

  • 查找子字符串

     string str = "Hello, World!";
     size_t pos = str.find("World");
     if (pos != string::npos) {
         cout << "'World' 在位置: " << pos << endl;  // 输出: 'World' 在位置: 7
     }


3. 常见 std::string 成员函数

  • length() or size():返回字符串的长度。

     string str = "Hello";
     cout << "长度: " << str.length() << endl;  // 输出: 5
     cout << "长度: " << str.size() << endl;  // 输出: 5

  • empty():检查字符串是否为空。

     string str = "";
     if (str.empty()) {
         cout << "字符串为空" << endl;
     }

  • append():在字符串末尾追加内容。

     string str = "Hello";
     str.append(" World");
     cout << str << endl;  // 输出: Hello World

  • substr():提取子字符串。

     string str = "Hello, World!";
     string sub = str.substr(7, 5);  // 从索引 7 开始,取 5 个字符
     cout << sub << endl;  // 输出: World

  • replace():替换字符串中的部分内容。

     string str = "Hello, World!";
     str.replace(7, 5, "C++");  // 替换 "World" 为 "C++"
     cout << str << endl;  // 输出: Hello, C++!

  • erase():删除字符串中的一部分。

     string str = "Hello, World!";
     str.erase(5, 7);  // 从索引 5 开始,删除 7 个字符
     cout << str << endl;  // 输出: Hello!

  • insert():在指定位置插入内容。

     string str = "Hello!";
     str.insert(5, ", World");  // 在索引 5 处插入 ", World"
     cout << str << endl;  // 输出: Hello, World!

  • c_str():返回 C 风格字符串。

     string str = "Hello";
     const char* cstr = str.c_str();
     cout << cstr << endl;  // 输出: Hello


4. 字符串流(std::stringstream

std::stringstream 是一个非常有用的类,它允许我们像操作文件一样处理字符串。通过它可以方便地进行字符串与其他数据类型的转换。

示例:
#include <iostream>
 #include <sstream>
 using namespace std;
 ​
 int main() {
     stringstream ss;
     
     // 字符串流输入
     ss << 100 << " " << 3.14 << " " << "Hello";
     
     // 字符串流输出
     int num;
     double pi;
     string word;
     ss >> num >> pi >> word;
     
     cout << "整数: " << num << endl;   // 输出: 整数: 100
     cout << "浮点数: " << pi << endl;  // 输出: 浮点数: 3.14
     cout << "字符串: " << word << endl;  // 输出: 字符串: Hello
     return 0;
 }

5. 注意事项与最佳实践

  • 使用 std::string 比使用 C 风格字符串更安全,因为它自动管理内存。

  • std::string 类提供了大量的便捷函数,减少了手动处理字符数组的复杂性。

  • C++11 后,std::string 支持移动语义,可以提高效率。


<cctype> 是 C++ 标准库中的一个头文件,它提供了一些用于字符处理的函数,这些函数可以用来检查字符的属性或转换字符的大小写。<cctype> 主要用于处理单个字符,而不是字符串。常见的字符操作有:

常见函数

  1. 字符分类函数: 这些函数用于判断字符是否属于某一特定类型。

    • isalnum(char c):检查字符是否为字母或数字。

    • isalpha(char c):检查字符是否为字母(a-z, A-Z)。

    • isdigit(char c):检查字符是否为数字(0-9)。

    • islower(char c):检查字符是否为小写字母(a-z)。

    • isupper(char c):检查字符是否为大写字母(A-Z)。

    • isspace(char c):检查字符是否为空格、制表符、换行符等空白字符。

    • isxdigit(char c):检查字符是否为十六进制数字(0-9, A-F, a-f)。

    示例

     
    #include <iostream>
     #include <cctype>
     ​
     int main() {
         char ch = 'a';
     ​
         if (isalpha(ch)) {
             std::cout << ch << " 是一个字母。" << std::endl;
         }
     ​
         if (islower(ch)) {
             std::cout << ch << " 是小写字母。" << std::endl;
         }
     ​
         return 0;
     }

  2. 字符转换函数: 这些函数用于字符的大小写转换。

    • tolower(char c):将字符转换为小写字母。如果字符已经是小写字母,返回该字符本身;否则返回其对应的小写字母。

    • toupper(char c):将字符转换为大写字母。如果字符已经是大写字母,返回该字符本身;否则返回其对应的大写字母。

    示例

     
    #include <iostream>
     #include <cctype>
     ​
     int main() {
         char ch1 = 'a', ch2 = 'B';
     ​
         std::cout << "小写字母 'a' 转换为大写: " << (char)toupper(ch1) << std::endl;
         std::cout << "大写字母 'B' 转换为小写: " << (char)tolower(ch2) << std::endl;
     ​
         return 0;
     }

  3. isblank(char c):检查字符是否为水平空格或制表符。

  4. isprint(char c):检查字符是否为可打印字符(包括空格)。

  5. isgraph(char c):检查字符是否为可打印字符(不包括空格)。

  6. iscntrl(char c):检查字符是否为控制字符(如换行符、回车符等)。

总结

在 C++ 中,字符串的操作非常灵活,可以使用传统的 C 风格字符串,也可以使用 C++ 标准库中的 std::string 类。std::string 类提供了丰富的功能,足以满足绝大部分的字符串操作需求。掌握了这些基础后,你可以更高效地处理和操作文本数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值