当前位置: 首页 > ai >正文

C++字符串解析2

C++字符串全解析:从基础操作到复杂场景实战

前言

字符串是编程中处理文本数据的核心载体。本文将系统覆盖 std::string 的全维度知识,包括声明初始化、输入输出、遍历操作、字符运算等基础语法,结合三道实战例题(平均绩点、句子缩写、位置互换)深入解析字符串与数值处理、函数设计的综合应用,帮助读者构建完整的字符串知识体系。

一、字符串基础语法与核心操作

1. 字符串的声明与初始化

头文件与命名空间

#include <string>    // 字符串容器头文件
#include <iostream>
using namespace std;

初始化方式

初始化方式示例代码结果说明
默认构造string s1;空字符串
常量字符串构造string s2("Hello");“Hello”
迭代器范围构造string s3(s2.begin(), s2.end()-1);截取s2前4个字符,即"Hell"
C风格字符串构造char c_str[] = "C-style"; string s4(c_str);从C风格字符串初始化,“C-style”
字符重复构造string s5(3, 'x');“xxx”
2. 输入输出与遍历

输入方式

  • cin:遇空格/换行终止,适用于单个字符串。
    string name;  
    cin >> name;  // 输入"Alice"(遇空格停止)
    
  • getline(cin, str):读取整行(含空格),丢弃换行符。
    string sentence;  
    getline(cin, sentence);  // 输入"Hello world!"(保留空格)
    

遍历方式

方式示例代码说明
下标遍历for (int i=0; i<s.length(); i++) cout<<s[i];高效,不检查越界
迭代器遍历for (auto it=s.begin(); it!=s.end(); it++) *it=toupper(*it);安全,可修改字符
范围for循环for (char c : s) cout << c;C++11特性,简洁易读
3. 字符与字符串操作

字符运算

  • ASCII码转换'a' + 1 == 'b''A' + 32 == 'a'
  • 大小写转换
    #include <cctype>  
    char c = 'a';  
    cout << toupper(c) << endl;  // 输出'A'(需包含<cctype>)
    

字符串拼接

string a = "Hello", b = "World";  
string c = a + ", " + b;       // "Hello, World"  
a.append(b, 0, 3);            // a变为"HelloWor"(追加b的前3个字符)

格式化输出(printf

#include <cstdio>  // 需包含此头文件  
double gpa = 3.85;  
printf("GPA: %.2f", gpa);  // 输出"GPA: 3.85"(C风格格式化)

二、实战例题1:平均绩点(浮点数运算与字符串输入)

题目描述

输入学生姓名(含空格)和多门课程绩点,计算平均绩点并保留两位小数输出。
输入格式

  • 第一行:姓名(含空格)
  • 第二行:课程数 n
  • 后续 n 行:各门课程绩点(浮点数)
知识点覆盖
  • getline 处理含空格输入
  • 浮点数累加与平均计算
  • printf 格式化输出(精度控制)
  • string.c_str() 转C风格字符串
代码实现
#include <iostream>  
#include <string>  
#include <cstdio>  // 用于printf  int main() {  string name;  getline(cin, name);  // 读取含空格的姓名  int n;  cin >> n;  double score, total = 0.0;  for (int i = 0; i < n; i++) {  cin >> score;  total += score;  // 累加绩点  }  double average = total / n;  // %s 需搭配C风格字符串,name.c_str()完成转换  printf("Student %s's GPA: %.2f\n", name.c_str(), average);  return 0;  
}  
关键点解析
  • 输入处理getline 确保姓名正确读取,避免cin遇空格中断。
  • 精度控制printf("%.2f") 强制保留两位小数。
  • 类型转换string 通过c_str()转为const char*,适配printf%s格式。

三、实战例题2:句子缩写(字符运算与函数设计)

题目描述

输入英文句子(单词用空格分隔),提取每个单词首字母转大写,组成缩写(如"hello world"→"HW")。

知识点覆盖
  • getline 读取整行句子
  • 字符判断与状态标记(标志位is_first
  • 函数引用传递(避免字符串拷贝开销)
  • toupper 字符转换
代码实现
#include <iostream>  
#include <string>  
#include <cctype>  // 用于toupper  string abbreviate(string& str, char delimiter) {  string result;  bool is_first = true;  // 标记是否为单词首字母  for (char c : str) {  if (c == delimiter) {  is_first = true;  // 遇到分隔符,下一个字符是新单词首字母  } else {  if (is_first) {  result += toupper(c);  // 首字母转大写  is_first = false;  }  }  }  return result;  
}  int main() {  string sentence;  getline(cin, sentence);  // 输入句子  string abbr = abbreviate(sentence, ' ');  // 调用函数生成缩写  cout << abbr << endl;  // 输出结果  return 0;  
}  
关键点解析
  • 逻辑核心:通过is_first标志位识别单词首字母,遇空格重置标志。
  • 函数设计string& str 引用传递,直接操作原字符串,避免大字符串拷贝。
  • 边界处理:自动忽略句首空格,连续空格不影响结果。

四、实战例题3:位置互换(字符串操作与函数练习)

题目描述

输入两个字符串,设计函数交换它们的内容并输出。

知识点覆盖
  • 字符串对象交换逻辑
  • 引用传递(string&)与值传递对比
  • 临时变量安全交换
代码实现(引用传递版本)
#include <iostream>  
#include <string>  void swapStrings(string& a, string& b) {  string temp = a;  // 临时变量存储副本  a = b;            // 交换内容  b = temp;         // 恢复副本到b  
}  int main() {  string s1, s2;  cin >> s1 >> s2;  // 输入两个字符串  swapStrings(s1, s2);  // 调用交换函数  cout << "After swap: " << s1 << " " << s2 << endl;  return 0;  
}  
关键点解析
  • 引用传递优势string& 直接操作外部变量,时间复杂度O(1),避免值传递的O(n)拷贝开销。
  • 值传递陷阱:若用void swapStrings(string a, string b),函数内修改不影响实参,需用指针或返回值。
  • 通用逻辑:适用于任何可拷贝类型(如int、自定义类),只需修改参数类型。

五、进阶技巧与综合应用

1. 标志位(flag)编程思想

用途:通过布尔变量控制复杂逻辑流程,如回文判断中跳过非字母字符。

bool isPalindrome(string& s) {  int left = 0, right = s.length() - 1;  while (left < right) {  // 跳过左侧非字母字符  while (left < right && !isalpha(s[left])) left++;  // 跳过右侧非字母字符  while (left < right && !isalpha(s[right])) right--;  // 比较大小写不敏感的字符  if (tolower(s[left++]) != tolower(s[right--])) return false;  }  return true;  
}  
2. 字符串与数值转换
  • 字符串→数值
    string numStr = "123.45";  
    int num_int = stoi(numStr);    // 123  
    double num_double = stod(numStr);  // 123.45  
    
  • 数值→字符串
    int score = 95;  
    string str = to_string(score);  // "95"  
    
3. 二维字符串数组(存储多行文本)
#include <vector>  
vector<string> lines;  
string line;  
while (getline(cin, line)) {  lines.push_back(line);  // 按行存储输入  
}  

六、知识图谱与学习路径

1. 知识体系图谱
字符串开发
基础操作
函数设计
综合实战
声明/初始化
输入输出
字符/串操作
引用传递
标志位逻辑
绩点计算
句子缩写
位置互换
2. 学习建议
  • 基础阶段
    • 熟练掌握 getlinecin 的配合,避免输入逻辑错误。
    • 通过LeetCode简单题(如125. 验证回文串)练习字符串遍历与双指针法。
  • 进阶阶段
    • 理解引用传递原理,对比值传递性能差异(如大字符串交换场景)。
    • 用标志位优化复杂逻辑(如680. 验证回文串 II)。
  • 实战阶段
    • 挑战3. 无重复字符的最长子串,结合哈希表提升效率。
    • 尝试文件操作(fstream),用字符串处理日志文件或文本分析任务。

总结

本文全面覆盖 C++ 字符串的核心知识点,从基础语法到函数设计,再到三道实战例题的完整解析。通过掌握字符串的灵活操作、数值文本转换、函数高效设计,读者可应对编程中多样化的字符串处理需求。后续可进一步学习正则表达式、KMP算法等高级主题,提升复杂场景下的文本处理能力。

http://www.xdnf.cn/news/12508.html

相关文章:

  • yolov11与双目测距结合,实现目标的识别和定位测距(onnx版本)
  • Docker、Wsl 打包迁移环境
  • |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面
  • pycharm 中文字体报错
  • 从零开始搭建 Pytest 测试框架(Python 3.8 + PyCharm 版)
  • Android Studio 解决首次安装时下载 Gradle 慢问题
  • spring中的@RabbitListener注解详解
  • C++设计模式 - 单例模式
  • Python Copilot【代码辅助工具】 简介
  • AI数据分析在体育中的应用:技术与实践
  • 初识结构体,整型提升及操作符的属性
  • 12.6Swing控件4 JSplitPane JTabbedPane
  • 第六章 进阶18 小杨的困惑
  • 博弈论概述
  • 网络库libhv介绍
  • Selenium自动化测试之弹窗处理
  • [Python学习日记-91] 并发编程之多线程 —— threading 模块、开启线程的方式、线程相关的其他方法
  • 腾讯加持,销售易 CRM 优势几何?
  • 本机无法远程别的计算机的方法
  • 自制喜悦字贴
  • QILSTE 精巧电子元件H4-108FO/5M解析
  • 观测云OaC能力升级,通过Terraform实现配置闭环
  • MySQL基础(一)介绍、下载及安装
  • w384药品管理系统的设计与实现
  • MySQL基础(三)DQL(Data Query Language,数据查询语言)
  • 【第一章:人工智能基础】01.Python基础及常用工具包-(1)Python语法与基础数据类型
  • 开源音乐播放器 MusicFree 项目介绍:自由、纯粹、高度自定义的听歌体验
  • 谷歌云代理商 | 游戏行业专属方案:谷歌云实时多人游戏服务器架构
  • STM32实战: CAN总线数据记录仪设计方案
  • 利用ProtoBuf 实现网络版通讯录