首页 > 编程语言 >C++入门 string常用接口(下)

C++入门 string常用接口(下)

时间:2024-06-12 13:31:48浏览次数:28  
标签:cout s2 void 入门 C++ test s1 string

目录

string类的常用接口说明

string类对象的修改操作(修饰符)

operator+= & append & push_back

assign & insert

erase & replace

swap & pop_back

string类对象的非成员函数

 operator+

relational operators(关系运算符)

getline

to_string & stoi

取域名使用实践


string类的常用接口说明

注:需要详细了解各接口使用方法,请访问网站:cplusplus.com - The C++ Resources Network

string类对象的修改操作(修饰符)

operator+= & append & push_back

void test_string19()
{
	string s1("hello world");
	cout << s1 << endl;

	// 尾插一个x
	s1.push_back('x');
	cout << s1 << endl;
	// 输出 hello worldx

	//在字符串后追加一个字符串
	s1.append(" yyyyyy!!");
	cout << s1 << endl;
	// 输出 hello worldx yyyyyy!!

	string s2("111111");

	//在字符串后追加字符串str
	s1 += 'y';
	s1 += "zzzzzzzz";
	s1 += s2;
	cout << s1 << endl;
	// 输出 hello worldx yyyyyy!!yzzzzzzzz111111
}

 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般 情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串

assign & insert

void test_string20()
{
	string s1("hello world");
	cout << s1 << endl;

	//为字符串分配一个新值,替换其当前内容
	s1.assign("111111");
	cout << s1 << endl;
	// 输出111111

	// 慎用,效率不高 -> O(N)
	// 实践中需求也不高
	string s2("hello world");
	s2.insert(0, "xxxx");
	cout << s2 << endl;
	// 输出 xxxxhello world

	char ch = 'y';
	cin >> ch;// 输入 kvl
	s2.insert(0, 1, ch);
	cout << s2 << endl;
	// 输出 kxxxxhello world

	s2.insert(s2.begin(), 'y');
	cout << s2 << endl;
	// 输出 ykxxxxhello world

	s2.insert(s2.begin(), s1.begin(), s1.end());
	cout << s2 << endl; 
	// 输出 111111ykxxxxhello world
}

erase & replace

void test_string21()
{
	string s1("hello world");
	cout << s1 << endl;

	// erase效率不高,慎用,和insert类似,要挪动数据
	s1.erase(0, 1);
	cout << s1 << endl;
	// 输出 ello world

	//s1.erase(5);	//和下面效果类似 默认从下标5位置开始删完
	s1.erase(5, 100);
	cout << s1 << endl;
	// 输出 ello

	// replace效率不高,慎用,和insert类似,要挪动数据
	string s2("hello world");
	s2.replace(5, 1, "%20");
	cout << s2 << endl;
	// 输出 hello % 20world
}

swap & pop_back

void test_string22()
{
	string a = "money";
	string b = "goods";
	cout << a <<' '<< b << endl;

	a.swap(b);
	a.pop_back();	// 尾删一个字符
	cout << a <<' '<< b << endl;
}

string类对象的非成员函数

 operator+

为了处理this指针只能在函数参数第一个位置的情况,C++将operator+设置为全局函数,就是应对一下情况:

void test_string23()
{
	string s1 = "hello";
	string s2 = "hello11";

	string ret1 = s1 + s2;
	cout << ret1 << endl;

	string ret2 = s1 + "xxxxx";
	cout << ret2 << endl;

	//特殊情况,this指针在第二个位置
	string ret3 = "xxxxx" + s1;
	cout << ret3 << endl;
}

relational operators(关系运算符)

void test_string23()
{
	string s1 = "hello";
	string s2 = "hello11";
	// 字典序比较
	cout << (s1 < s2) << endl;
}

按照ascii码比较即可,一位一位依次比较。

getline

从输入中提取整行字符,直到找到分隔符 dim或换行符 '\n'为止

void test_string24()
{
	// 默认规定空格或者换行是多个值之间分割
	string str;
	//cin >> str;
	getline(cin, str);
	//类似gets

	cout << str << endl;
}

to_string & stoi

int main()
{
	// atoi   字符转整形  
	// itoa	  整形转字符
	// stoi   string转整形

	// to_string  整形转string
	int x = 0, y = 0;
	cin >> x>>y;
	string str = to_string(x + y);
	cout << str << endl;

	int z = stoi(str);

	return 0;
}

注意,字符串转整型最多只能转42亿一下的(unsigne int)平常不建议使用string转整形。


取域名使用实践

void test_string26()
{
	string file("string.cpp.zip");
	//从后往前找第一个出现.的地方
	size_t pos = file.rfind('.');
	//string suffix = file.substr(pos, file.size() - pos);
	string suffix = file.substr(pos);
	//从.开始取到字符串结束

	cout << suffix << endl;//  .zip

	string url("https://gitee.com/TestString.cpp");
	//从前往后找第一个出现:的地方
	size_t pos1 = url.find(':');
	//substr区间为左闭右开,取不到:
	string url1 = url.substr(0, pos1 - 0);
	cout << url1 << endl;//  http

	size_t pos2 = url.find('/', pos1 + 3);//跳过://找第一个出现/的位置
	string url2 = url.substr(pos1 + 3, pos2 - (pos1 + 3));
	cout << url2 << endl;//  gitee.com

	string url3 = url.substr(pos2 + 1);
	cout << url3 << endl;// TestString.cpp
}

通过灵活运用上面的接口,可以实现取网址端口和域名的功能,下期讲解常用端口的底层实现。

标签:cout,s2,void,入门,C++,test,s1,string
From: https://blog.csdn.net/fen_0108/article/details/139603876

相关文章

  • 一步步了解C++类型转换:static_cast、const_cast、reinterpret_cast和dynamic_cast
    1. static_caststatic_cast 可以用于基础类型之间的转换,类层次结构中的父类和子类之间的转换,以及把 void* 转换成目标类型的指针等。静态类型转换示例:#include<iostream>classBase{};classDerived:publicBase{};intmain(){//基础数据类型int......
  • yolov8分割法 C++部署
     使用的命令:condalist 参考资料https://github.com/triple-Mu/YOLOv8-TensorRT/blob/main/docs/Segment.md1.python3export-seg.py--weight./0.0.0/yolov8s-seg.pt--opset11--sim--input-shape13640640--devicecuda:0报错:ModuleNotFoundError:Nomodule......
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
      学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决.......
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
      学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决.......
  • 网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
      学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决.......
  • Python学习笔记5:入门知识(五)
    引言距离上次更新Python的学习笔记,有个四五天,主要原因有两个:一是忙,没有时间,第二个就是之前学的路线,已经到头了,我找不到下面学习路线的资料。主要说下第二点是主要原因。我为啥明知道这个只能到入门一点点还用这份资料?主要还是因为大佬入门知识写的好,我学起来感觉不吃力,有......
  • 计算机毕业设计项目推荐,32127 爬虫-自驾游搜索系统(开题答辩+程序定制+全套文案 )上万套
    目 录摘要1绪论1.1研究背景1.2爬虫技术1.3flask框架介绍21.4论文结构与章节安排32 自驾游搜索系统分析42.1可行性分析42.2系统流程分析42.2.1数据增加流程52.3.2数据修改流程52.3.3数据删除流程52.3系统功能分析52.3.1功能性分析62.......
  • 计算机毕业设计项目推荐,32006 node 中国传统节日介绍网站(开题答辩+程序定制+全套文案
    基于node.js中国传统节日介绍网站 摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,中国传统节日介绍网站当然也不能排除在外。中国传统节日介绍网站是以实际运用为开发背景,运用软件工程原理和开发方法,采......
  • 计算机毕业设计项目推荐,29042 基于Web的医院护理管理系统的设计(开题答辩+程序定制+全
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,医院当然也不例外。医院预约管理系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发过程首先对软件系统进......
  • C/C++ 宏定义注意事项
    在C/C++中,宏定义是通过#define预处理指令来实现的。宏定义虽然方便,但也有一些潜在的问题和注意事项需要开发者注意。以下是关于C/C++宏定义相关的注意事项:没有类型检查:宏定义是文本替换,所以编译器不会进行类型检查。这可能导致在替换后产生类型不匹配或意外的行为。括......