string类学习

本篇将深入学习string类,通过各个测试函数玩遍c++string类,学到就是赚到!!!

文章目录

  • 1.头文件和源文件
    • 1.1源文件
    • 1.2头文件
  • 2.构造函数
  • 3.赋值重载函数
  • 4.元素访问运算符
  • 5.迭代器
    • 5.1正向迭代器
    • 5.2反向迭代器
  • 6.添加字符串
  • 7.vs下扩容机制
  • 8.insert()函数
  • 9.c_str()函数
  • 10.find、rfind、substr
    • 10.1综合应用
    • 10.2rfind()应用
  • 11.find_first_of
  • 12.字符串转换
  • 13.运行结果

1.头文件和源文件

完整代码点击 string类学习 跳转码云获取

1.1源文件

#include"string.h"
int main()
{/*test_string01();test_string02();test_string03();test_string04();test_string06();test_string07();test_string08();test_string09();test_string10();test_string11();test_string12();test_string13();*/return 0;
}

1.2头文件

#paragma once
#include<iostream>
#include<string>
#include<list>
#include<assert.h>
using namespace std;

2.构造函数

void test_string01()
{//1.无参构造 string();string s1;//2.有参构造 string (const char* s);//string s2("hello world"); string s2 = "hello world";//*s--tmp--s2  构造+拷贝//3.拷贝构造 string (const string& str);string s3(s2);//4.部分拷贝构造//string(const string & str, size_t pos, size_t len = npos);//len参数分析://(1)不传参:取缺省值-1==取到结尾//(2)len > n:取到结尾string s4(s2, 6, 5);//5.部分构造string (const char* s, size_t n);string s5("hello world", 5);//6.字符构造string (size_t n, char c);string s6(10, '*');
}

3.赋值重载函数

void test_string02()
{string s1;string s2 = "hello world";//构造+拷贝->构造//1.string& operator= (const string& str);s1 = s2;//2.string& operator= (const char* s);s1 = "xxx";//3.string& operator= (char c);s1 = 'x';
}

4.元素访问运算符

void test_string03()
{string s1("hello world");//s1.operator[](2)cout << s1[2] << endl;s1[2] = 'x';cout << s1[2] << endl;//1.char& operator[] (size_t pos); //遍历string,每个字符+1for (size_t i = 0; i < s1.size(); i++){s1[i]++;}cout << s1 << endl;//2.const char& operator[] (size_t pos) const;const string s2("world");for (size_t i = 0; i < s1.size(); i++){cout << s2 << endl;}//3.内部检查越界//s2[6];//at运算符//与operator[]区别:// 越界抛异常//char& at(size_t pos); //const char& at(size_t pos) const;
}

5.迭代器

5.1正向迭代器

在这里插入图片描述

//iterator begin();
//const_iterator begin() const;
void test_string04()
{//1.遍历sstring s("hello");string::iterator it = s.begin();while (it != s.end()){(*it)++;cout << *it << " ";++it;}cout << endl;// 2.范围for -- 自动迭代,自动判断结束// 依次取s中每个字符,赋值给ch/*for (auto ch : s){ch++;cout << ch << " ";}*/for (auto& ch : s){ch++;cout << ch << " ";}cout << endl << s << endl;//3.list同样适用list<int> lt(10, 1);list<int>::iterator lit = lt.begin();while (lit != lt.end()){cout << *lit << " ";++lit;}cout << endl;for (auto e : lt){cout << e << " ";}cout << endl;// 范围for底层其实就是迭代器
}

5.2反向迭代器

在这里插入图片描述

void func(const string& str)
{//正向迭代器//string::const_iterator it = str.begin();auto it = str.begin();while (it != str.end()){//*it = 'x';cout << *it << " ";++it;}cout << endl;//反向迭代器//string::const_reverse_iterator rit = str.rbegin();auto rit = str.rbegin();while (rit != str.rend()){cout << *rit << " ";++rit;}cout << endl;
}void test_string05()
{string s("hello");string::reverse_iterator rit = s.rbegin();while (rit != s.rend()){cout << *rit << " ";++rit;}cout << endl;func(s);//迭代器:// //iterator begin();//const_iterator begin() const;//reverse_iterator rbegin(); //const_reverse_iterator rbegin() const;
}

6.添加字符串

void test_string06()
{//void push_back(char c);string s("hello");s.push_back('-');s.push_back('-');//string& append(const char* s);s.append("world");cout << s << endl;//string& operator+= (const string & str);//string & operator+= (const char* s);//string& operator+= (char c);string str("我来了");s += str;s += "!!!";s += '@';cout << s << endl;//template <class InputIterator>   //string& append(InputIterator first, InputIterator last);s.append(++str.begin(), --str.end());cout << s << endl;//string copy(++s.begin(), --s.end());string copy(s.begin() + 5, s.end() - 5);cout << copy << endl;
}

7.vs下扩容机制

void test_string07()
{//string s1("11111111111111");//cout << s1.max_size() << endl;//cout << s1.capacity() << endl;string s;s.reserve(1000);       //开空间//s.resize(1000, 'x'); //开空间+初始化size_t sz = s.capacity();sz = s.capacity();cout << "capacity changed: " << sz << '\n';cout << "making s grow:\n";for (int i = 0; i < 1000; ++i){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed: " << sz << '\n';}}
}

在这里插入图片描述

8.insert()函数

//string& insert (size_t pos, const char* s);
void test_string08()
{string str("wo lai le");//1.使用易错// wo20%20% lai le /*for (size_t i = 0; i < str.size();i++){if (str[i] == ' '){str.insert(i, "20%");i += 4;}}*///2.1修正//wo20% lai20% le/*for (size_t i = 0; i < str.size();){if (str[i] == ' '){str.insert(i, "20%");i += 4;}else{++i;}}*///2.2修正//string& erase (size_t pos = 0, size_t len = npos);/*for (size_t i = 0; i < str.size(); ++i){if (str[i] == ' '){str.insert(i, "20%");i += 3;}}cout << str << endl;for (size_t i = 0; i < str.size(); ++i){if (str[i] == ' '){str.erase(i, 1);}}cout << str << endl;*///3.改进(以空间换时间)string newstr;for (size_t i = 0; i < str.size(); ++i){if (str[i] != ' '){newstr += str[i];}else{newstr += "20%";}}cout << newstr << endl;//4.replace(效率不高)//string& replace (size_t pos,  size_t len,  const char* s);for (size_t i = 0; i < str.size(); ++i){if (str[i] == ' '){str.replace(i, 1, "20%");}}cout << str << endl;
}

9.c_str()函数

const char* c_str() const;
void test_string09()
{string filename("test.cpp");FILE* fout = fopen(filename.c_str(), "r");assert(fout);char ch = fgetc(fout);while (ch != EOF){cout << ch;ch = fgetc(fout);}
}
//C++与C的字符串区别
void test_string10()
{string filename("test.cpp");cout << filename << endl;cout << filename.c_str() << endl;filename += '\0';filename += "string.cpp";cout << filename << endl;cout << filename.c_str() << endl;
}

10.find、rfind、substr

10.1综合应用

void DealUrl(const string& url)
{size_t pos1 = url.find("://");if (pos1 == string::npos){cout << "非法url" << endl;return;}string protocol = url.substr(0, pos1);cout << protocol << endl;size_t pos2 = url.find('/', pos1 + 3);if (pos2 == string::npos){cout << "非法url" << endl;return;}string domain = url.substr(pos1 + 3, pos2 - pos1 - 3);cout << domain << endl;string uri = url.substr(pos2 + 1);cout << uri << endl << endl;
}
void test_string11()
{string filename("test.cpp.tar.zip");//size_t find(char c, size_t pos = 0) const;//size_t rfind(char c, size_t pos = npos) const;//size_t pos = filename.find('.');size_t pos = filename.rfind('.');if (pos != string::npos){//string substr (size_t pos = 0, size_t len = npos) const;//string suff = filename.substr(pos, filename.size() - pos);string suff = filename.substr(pos);cout << suff << endl;}//协议名://域名/动作string url1 = "https://cplusplus.com/reference/string/string/";string url3 = "ftp://ftp.cs.umd.edu/pub/skipLists/skiplists.pdf";DealUrl(url1);DealUrl(url3);
}

10.2rfind()应用

//输出一行字符串中最后一个单词长度
void function()
{string str;//istream& getline(istream & is, string & str);getline(cin, str);size_t pos = str.rfind(' ');if (pos != string::npos){cout << str.size() - pos - 1;}elsecout << str.size() << endl;
}

11.find_first_of

size_t find_first_of (const char* s, size_t pos = 0) const;
void test_string12()
{string str("Please, replace the vowels in this sentence by asterisks.");size_t found = str.find_first_of("aeiou");while (found != string::npos){str[found] = '*';found = str.find_first_of("aeiou", found + 1);}//遍历A--找到与B相同的字符返回位置cout << str << '\n';
}

12.字符串转换

void test_string13()
{int ival;double dval;cin >> ival >> dval;string istr = to_string(ival);string dstr = to_string(dval);cout << istr << endl;cout << dstr << endl;istr = "9999";dstr = "9999.99";ival = stoi(istr);dval = stod(dstr);
}

13.运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年java还是golang还是c#?

前言 我们可以先来看一下这三门语言各自的优劣 学习曲线&#xff1a;如果你是初学者或对编程相对陌生&#xff0c;Java可能是一个较好的选择。它有广泛的学习资源和社区支持&#xff0c;易于上手。Go也有简单易学的特点&#xff0c;但由于相对较年轻&#xff0c;相关的学习资…

KEIL5-MDK配色方案

改字体 复制如下代码&#xff0c;替换原有文件内容 global.prop文件&#xff1a;D:Keil_v5\UV4\global.prop # properties for all file types indent.automatic1 virtual.space0 view.whitespace0 view.endofline0 code.page0 caretline.visible0 highlight.matchingbraces1 …

Redis是什么?(详细安装步骤)

一、Redis简介&#x1f349; 背景 在Web应用发展的初期&#xff0c;那时关系型数据库受到了较为广泛的关注和应用&#xff0c;原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来&#xff0c;随着访问量的提升&#xff0c;使用关系型数据库的Web站点多多少少…

C/C++编程安全标准GJB-8114解读——声明定义类

软件检测实验室在建立软件测试体系或申请cnas/cma相关资质时&#xff0c;需要依据相关标准&#xff0c;使用有效的方法开展检验检测活动&#xff0c;GJB-8114是一部嵌入式软件安全测试相关的国家标准&#xff0c;本系列文章我们就针对GJB-8114《C/C语言编程安全子集》的具体内容…

论好名字的重要性: Linux内核page到folio的变迁

一、引子 Once upon a time&#xff0c;Netscape的大拿 Phil Karlton曾经说过&#xff1a;“There are only two hard things in Computer Science: cache invalidation and naming things”&#xff0c;成为程序界流传甚广的名言&#xff0c;可见取名是计算机科学中最难的两件…

postman持续集成-Jenkins手动构建

Jenkins启动 在jenkins.war文件所在的目录输入cmd打开终端输入: java -jar jenkins.war启动服务,启动后终端的窗口不要关闭 在浏览器地址栏输入:localhost:8080 准备工作 打开已完成并测试无误的postman项目脚本,再次执行测试 导出测试用例集和测试环境两个文件,注意全部…

基于深度学习的人脸面部表情识别系统【含Python源码+PyqtUI界面+原理详解】

功能演示 摘要&#xff1a;面部表情识别&#xff08;Facial Expression Recognition&#xff09;是一种通过技术手段识别人物图像中人脸面部表情的技术。本文详细介绍了其实现的技术原理&#xff0c;同时给出完整的Python实现代码、训练好的深度学习模型&#xff0c;并且通过Py…

线性代数行列式的几何含义

行列式可以看做是一系列列向量的排列&#xff0c;并且每个列向量的分量可以理解为其对应标准正交基下的坐标。 行列式有非常直观的几何意义&#xff0c;例如&#xff1a; 二维行列式按列向量排列依次是 a \mathbf{a} a和 b \mathbf{b} b&#xff0c;可以表示 a \mathbf{a} a和…

《强化学习的数学原理》思维导图,供初学者参考

对应课程&#xff1a; 【强化学习的数学原理】课程&#xff1a;从零开始到透彻理解&#xff08;完结&#xff09;_哔哩哔哩_bilibili

华为云专家出品《深入理解边缘计算》电子书上线

华为开发者大会PaaS生态电子书推荐&#xff0c;助你成为了不起的开发者&#xff01; 什么是边缘计算&#xff1f;边缘计算的应用场景有哪些&#xff1f; 华为云出品《深入理解边缘计算》电子书上线 带你系统理解云、边、端协同的相关原理 了解开源项目的源码分析流程 学成能…

SpringBoot第27讲:SpringBoot集成MySQL - MyBatis 多个数据源

SpringBoot第27讲&#xff1a;SpringBoot集成MySQL - MyBatis 多个数据源 本文是SpringBoot第27讲&#xff0c;在某些场景下&#xff0c;Springboot需要使用多个数据源&#xff0c;以及某些场景会需要多个数据源的动态切换。本文主要介绍上述场景及 SpringBootMyBatis实现多个数…

策略模式(Strategy)

定义 策略是一种行为设计模式&#xff0c;它能让你定义一系列算法&#xff0c;并将每种算法分别放入独立的类中&#xff0c;以使算法的对象能够相互替换。 前言 1. 问题 你打算为游客们创建一款导游程序。该程序的核心功能是提供美观的地图&#xff0c;以帮助用户在任何城市…