📝 C++ 字符串 - L18 高级概念

深入学习string类型和字符串的各种操作

📚 什么是字符串?

从字符到字符串

之前我们学过char类型只能存储单个字符,而字符串(string)可以存储一串字符

  • 字符序列:由多个字符组成的序列
  • 可变长度:可以随时增加或减少字符
  • 丰富操作:拼接、查找、替换、截取等
  • 面向对象:string是C++标准库提供的类
💡 形象比喻:
• char就像一颗珍珠,string就像一串项链
• char是一个字母,string是一个单词或句子
• string可以看作是一个特殊的字符数组

string vs char数组

#include <iostream> #include <string> // 必须包含这个头文件 using namespace std; int main() { // 方式1:使用string类型(推荐) string str1 = "Hello"; string str2 = "World"; // 方式2:使用char数组(传统方式) char arr[] = "Hello"; // string的优势: // 1. 可以直接用+拼接 string result = str1 + " " + str2; // "Hello World" // 2. 可以直接比较 if (str1 == "Hello") { cout << "相等" << endl; } // 3. 可以获取长度 cout << "长度:" << str1.length() << endl; // 5 return 0; }
💡 推荐使用string的原因:
• 更安全,不会越界
• 操作更简单直观
• 功能更强大
• 自动管理内存

string的声明和初始化

#include <iostream> #include <string> using namespace std; int main() { // 方式1:直接初始化 string str1 = "Hello"; // 方式2:构造函数初始化 string str2("World"); // 方式3:空字符串 string str3; // 空字符串 "" // 方式4:重复字符 string str4(5, '*'); // "*****" // 方式5:从另一个字符串复制 string str5 = str1; // "Hello" // 输出所有字符串 cout << "str1: " << str1 << endl; cout << "str2: " << str2 << endl; cout << "str3: " << str3 << "(空)" << endl; cout << "str4: " << str4 << endl; cout << "str5: " << str5 << endl; return 0; }

⚙️ 字符串的基本操作

字符串的输入和输出

#include <iostream> #include <string> using namespace std; int main() { string name; // 方式1:cin(遇到空格停止) cout << "请输入姓名:"; cin >> name; cout << "你好," << name << endl; // 方式2:getline(读取整行,包括空格) string sentence; cout << "请输入一句话:"; cin.ignore(); // 清除缓冲区的换行符 getline(cin, sentence); cout << "你说的是:" << sentence << endl; return 0; }
⚠️ 重要区别:
cin >> str:遇到空格、制表符、换行符就停止
getline(cin, str):读取整行,直到遇到换行符
• 如果先用了cin,再用getline,需要用cin.ignore()清除缓冲区

字符串的拼接

#include <iostream> #include <string> using namespace std; int main() { string firstName = "张"; string lastName = "三"; // 方式1:使用+运算符 string fullName = firstName + lastName; cout << "姓名:" << fullName << endl; // 张三 // 方式2:使用+=运算符 string greeting = "你好,"; greeting += fullName; greeting += "!"; cout << greeting << endl; // 你好,张三! // 方式3:拼接数字(需要转换) int age = 18; string info = "年龄:" + to_string(age); cout << info << endl; // 年龄:18 return 0; }

访问字符串中的字符

#include <iostream> #include <string> using namespace std; int main() { string str = "Hello"; // 方式1:使用下标访问(类似数组) cout << "第1个字符:" << str[0] << endl; // H cout << "第3个字符:" << str[2] << endl; // l // 方式2:使用at()方法(更安全) cout << "第1个字符:" << str.at(0) << endl; // H // 修改字符 str[0] = 'h'; cout << "修改后:" << str << endl; // hello // 遍历字符串 cout << "逐个字符:"; for (int i = 0; i < str.length(); i++) { cout << str[i] << " "; } cout << endl; return 0; }
🎮 互动实验:字符串操作演示

输入两个字符串,体验各种操作

输入字符串后点击"演示操作"...

🛠️ 字符串的常用方法

获取字符串长度

#include <iostream> #include <string> using namespace std; int main() { string str = "Hello World"; // 方式1:length()方法 cout << "长度:" << str.length() << endl; // 11 // 方式2:size()方法(和length()一样) cout << "大小:" << str.size() << endl; // 11 // 判断是否为空 if (str.empty()) { cout << "字符串为空" << endl; } else { cout << "字符串不为空" << endl; } return 0; }

查找子字符串

#include <iostream> #include <string> using namespace std; int main() { string str = "Hello World, Hello C++"; string target = "Hello"; // find()方法:查找第一次出现的位置 size_t pos = str.find(target); if (pos != string::npos) { cout << "找到\"" << target << "\",位置:" << pos << endl; } else { cout << "未找到\"" << target << "\"" << endl; } // 统计出现次数 int count = 0; size_t start = 0; while ((pos = str.find(target, start)) != string::npos) { count++; start = pos + 1; } cout << target << " 出现了 " << count << " 次" << endl; return 0; }

截取子字符串

#include <iostream> #include <string> using namespace std; int main() { string str = "Hello World"; // substr(起始位置, 长度) string sub1 = str.substr(0, 5); // "Hello" string sub2 = str.substr(6); // "World"(从位置6到末尾) cout << "原字符串:" << str << endl; cout << "子串1:" << sub1 << endl; cout << "子串2:" << sub2 << endl; return 0; }

字符串比较

#include <iostream> #include <string> using namespace std; int main() { string str1 = "apple"; string str2 = "banana"; string str3 = "apple"; // 直接比较 if (str1 == str3) { cout << "str1 和 str3 相等" << endl; } if (str1 < str2) { cout << "\"" << str1 << "\" 在 \"" << str2 << "\" 前面" << endl; } // compare()方法 int result = str1.compare(str2); if (result < 0) { cout << "str1 < str2" << endl; } else if (result > 0) { cout << "str1 > str2" << endl; } else { cout << "str1 == str2" << endl; } return 0; }

字符串转换

#include <iostream> #include <string> using namespace std; int main() { // 数字转字符串 int num = 123; string str = to_string(num); cout << "数字转字符串:" << str << endl; // "123" // 字符串转数字 string strNum = "456"; int num2 = stoi(strNum); // string to int cout << "字符串转数字:" << num2 << endl; // 456 double num3 = stod("3.14"); // string to double cout << "字符串转浮点数:" << num3 << endl; // 3.14 return 0; }
🎯 字符串工具集

选择要执行的字符串操作

输入字符串后选择操作...

🚀 字符串的高级应用

实际应用:简单的文本处理

#include <iostream> #include <string> using namespace std; int main() { string text = " Hello World C++ "; cout << "原文本:\"" << text << "\"" << endl; cout << "长度:" << text.length() << endl; // 统计单词数(简单实现) int wordCount = 0; bool inWord = false; for (int i = 0; i < text.length(); i++) { if (text[i] != ' ' && !inWord) { wordCount++; inWord = true; } else if (text[i] == ' ') { inWord = false; } } cout << "单词数:" << wordCount << endl; return 0; }

字符串的实际应用场景

字符串在实际编程中有广泛应用:

  • 📝 用户输入处理:姓名、地址、评论等
  • 🔍 搜索功能:查找关键词、过滤内容
  • 🌐 网络编程:URL、HTTP请求、JSON数据
  • 📄 文件处理:读取文本文件、日志分析
  • 🔐 密码验证:检查密码强度、加密解密
  • 📊 数据解析:CSV文件、配置文件

常见错误和注意事项

// ❌ 错误1:忘记包含头文件 string str = "Hello"; // 编译错误! // ✅ 正确:必须包含<string> #include <string> string str = "Hello"; // ❌ 错误2:混合使用cin和getline cin >> name; getline(cin, sentence); // 可能读取到空行 // ✅ 正确:使用cin.ignore() cin >> name; cin.ignore(); getline(cin, sentence); // ❌ 错误3:访问越界 string str = "Hi"; cout << str[5] << endl; // 未定义行为 // ✅ 正确:先检查长度 if (5 < str.length()) { cout << str[5] << endl; }

📝 实战练习

📝 理解测试

以下代码的输出是什么?

#include <iostream> #include <string> using namespace std; int main() { string str = "Hello"; str += " "; str += "World"; cout << str.length() << endl; return 0; }
选择答案查看解析...
💻 综合挑战

题目:创建一个程序,实现一个简单的回文检测器。回文是指正读和反读都一样的字符串,如"aba"、"madam"。

输入字符串后点击"生成代码"...