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

CSP-J/S冲奖第5天:C++ 字符串

一、什么是字符串?

  • 定义:字符串是由字符组成的序列,用于存储和操作文本数据。

  • 类比:就像现实生活中的句子或单词,字符串是由一个个字母(字符)组成的。

  • 特点
    • 字符串可以包含字母、数字、符号等。

    • 在 C++ 中,有两种主要的字符串表示方式:
      1. C 风格字符串:以字符数组的形式存储,以空字符 \0 结尾。

      2. std::string 类型:C++ 标准库提供的字符串类型,功能更强大且易于使用。


二、C 风格字符串

1. 定义与初始化
  • 定义:C 风格字符串是一个字符数组,以空字符 \0 结尾。

  • 语法
    char 字符串名[大小];
    
  • 初始化
    char greeting[] = "Hello"; // 自动添加末尾的 '\0'
    char name[10] = {'J', 'o', 'h', 'n', '\0'}; // 手动添加 '\0'
    

1V1+:malaoshi606

2. 示例
#include <iostream>
using namespace std;

int main() {
    char greeting[] = "Hello, World!";
    cout << greeting << endl; // 输出字符串
    return 0;
}

运行结果

Hello, World!

3. 常见问题
  • 固定大小:C 风格字符串的大小在定义时固定,无法动态扩展。

  • 越界风险:如果忘记添加 \0 或超出数组范围,可能导致未定义行为。

  • 操作复杂:需要手动处理字符串拼接、比较等操作。


三、std::string 类型

1. 定义与初始化
  • 定义std::string 是 C++ 标准库提供的字符串类型,位于 <string> 头文件中。

  • 语法
    string 字符串名;
    
  • 初始化
    string greeting = "Hello, World!";
    string empty; // 空字符串
    string copy = greeting; // 拷贝另一个字符串
    
2. 示例
#include <iostream>
#include <string> // 包含 string 头文件
using namespace std;

int main() {
    string greeting = "Hello, World!";
    cout << greeting << endl; // 输出字符串
    return 0;
}

运行结果

Hello, World!

3. 常见操作
(1) 输入与输出
  • 使用 cingetline 读取字符串:
    string name;
    cout << "请输入你的名字:";
    cin >> name; // 只能读取一个单词(遇到空格停止)
    cout << "你好," << name << endl;
    
    string sentence;
    cout << "请输入一句话:";
    getline(cin, sentence); // 读取整行输入(包括空格)
    cout << "你输入的是:" << sentence << endl;
    
(2) 拼接字符串
  • 使用 + 运算符连接两个字符串:
    string first = "Hello, ";
    string second = "World!";
    string result = first + second;
    cout << result << endl; // 输出 "Hello, World!"
    
(3) 获取长度
  • 使用 .size().length() 方法获取字符串的长度:
    string text = "C++ is fun!";
    cout << "字符串长度:" << text.size() << endl; // 输出 11
    
(4) 访问字符
  • 使用索引访问字符串中的单个字符(从 0 开始):
    string text = "Hello";
    cout << "第一个字符:" << text[0] << endl; // 输出 'H'
    cout << "最后一个字符:" << text[text.size() - 1] << endl; // 输出 'o'
    
(5) 比较字符串
  • 使用 ==!=<> 等运算符比较字符串:
    string a = "apple";
    string b = "banana";
    if (a < b) {
        cout << a << " 在字典序上小于 " << b << endl;
    }
    
(6) 查找子字符串
  • 使用 .find() 方法查找子字符串的位置:
    string text = "Hello, World!";
    size_t pos = text.find("World"); // 返回子字符串的起始位置
    if (pos != string::npos) { // 如果找到
        cout << "子字符串 'World' 的位置:" << pos << endl; // 输出 7
    } else {
        cout << "未找到子字符串" << endl;
    }
    

四、综合练习

练习 1:统计字符数量

编写一个程序,输入一个字符串,统计其中字母、数字和其他字符的数量。

参考代码

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

int main() {
    string text;
    cout << "请输入一个字符串:";
    getline(cin, text);

    int letters = 0, digits = 0, others = 0;

    for (char c : text) { // 遍历字符串中的每个字符
        if (isalpha(c)) { // 判断是否为字母
            letters++;
        } else if (isdigit(c)) { // 判断是否为数字
            digits++;
        } else { // 其他字符
            others++;
        }
    }

    cout << "字母数量:" << letters << endl;
    cout << "数字数量:" << digits << endl;
    cout << "其他字符数量:" << others << endl;

    return 0;
}

练习 2:反转字符串

编写一个程序,输入一个字符串,将其反转并输出。

参考代码

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

int main() {
    string text;
    cout << "请输入一个字符串:";
    getline(cin, text);

    string reversed = "";
    for (int i = text.size() - 1; i >= 0; i--) {
        reversed += text[i]; // 从后往前拼接字符
    }

    cout << "反转后的字符串:" << reversed << endl;

    return 0;
}

练习 3:判断回文字符串

编写一个程序,输入一个字符串,判断它是否是回文字符串(正着读和反着读相同)。

参考代码

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

int main() {
    string text;
    cout << "请输入一个字符串:";
    getline(cin, text);

    bool isPalindrome = true;
    int n = text.size();
    for (int i = 0; i < n / 2; i++) {
        if (text[i] != text[n - i - 1]) { // 比较首尾字符
            isPalindrome = false;
            break;
        }
    }

    if (isPalindrome) {
        cout << "这是一个回文字符串" << endl;
    } else {
        cout << "这不是一个回文字符串" << endl;
    }

    return 0;
}

五、注意事项

  1. C 风格字符串的风险

    • 必须确保以 \0 结尾,否则可能导致未定义行为。

    • 不支持直接拼接、比较等操作,需使用标准库函数(如 strcmpstrcat 等)。

  2. std::string 的优势

    • 动态扩展,无需担心大小限制。

    • 提供丰富的内置方法,简化字符串操作。

  3. 输入方式的选择

    • cin:只能读取一个单词(遇到空格停止)。

    • getline:可以读取整行输入(包括空格)。


六、总结

  1. 字符串是存储和操作文本数据的重要工具。

  2. C++ 提供了两种字符串表示方式:C 风格字符串std::string 类型

  3. std::string 更加灵活和易用,推荐初学者优先使用。

  4. 常见的操作包括拼接、比较、查找、反转等。

  5. 注意避免数组越界和未初始化的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/49337.html

相关文章:

  • 多视图几何--2单应矩阵-2.0从0-1理解并计算单应矩阵
  • Linux —— 线程池
  • 从基础到实践(十):MOS管的全面解析与实际应用
  • Java/Kotlin 开发者如何快速入门 C++
  • Centos7搭建PHP项目,环境(Apache+PHP7.4+Mysql5.7)
  • 服务注册中心-Eureka
  • 自定义正态分布区间划分与可视化
  • 蓝桥试题:混境之地(记忆化搜索)
  • html中几个符号的转义和还原
  • 【竞技宝】CS2-EPLS21:SAW击败M80晋级正赛!
  • LeetCode - 26 删除有序数组中的重复项
  • 解压小游戏“动态禅意沙画“
  • VSCode详细安装步骤,适用于 Windows/macOS/Linux 系统
  • ES 分布式搜索引擎【一】
  • Nest系列:从环境变量到工程化实践-2
  • 大模型管理工具:LLaMA-Factory
  • 深入理解C++ stl::list 底层实现+模拟实现
  • 多线程与异步任务处理(二):Kotlin协程
  • 深入解析EfficientNet:高效深度学习网络与ResNet的对比(使用keras进行代码复现,并使用cifar10数据集进行实战)
  • 小型充气泵方案:充气泵pcba结构组成
  • Chrome扩展background.js访问剪贴板指南
  • 文本处理Bert面试内容整理-BERT的预训练任务是什么?
  • VulnHub-FristiLeaks_1.3靶机-信息泄露图片base加解密+文件上传+反向shel
  • Qt命名规范制-name() or getName()
  • springboot宠物服务系统-计算机毕业设计源码29146
  • 计算机毕业设计SpringBoot+Vue.js网上服装商城(源码+文档+PPT+讲解)
  • 在 Ubuntu 系统 22.04 上安装 Docker
  • 让 LabVIEW 程序更稳定
  • Python:函数,return返回值与形参实参
  • Excel-to-JSON v2.0.0发布,可以在Excel内部,把Excel表格转换成JSON,嵌套的JSON也能转