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

关于C++ string类的基本操作实验 一

首先在调用前要包含一行头文件

#include<string>

然后包含命名空间

using namespace std;

或者

using namespace std::string;


好,让我们开始我们的实验。

首先是创建变量

string s;

我们可以在创建变量的同时对它赋值.

string s = "test";

或者我们调用构造函数对它进行创建和初始化

string s("test");

或者还有一个构造函数 string(int n,char c);   

eg. 

string s(4,'0');
我们用c++中的cout打印s,输出

0000

好,至此创建和初始化实验完毕。让我们继续接下来的实验。

销毁:(析构函数)

s.~string() //销毁所有字符,释放内存


const char &operator[](int n)const;

string类可以直接通过[]运算符类似C语言中的数组通过下标访问.

	string s = "0123456789";
	cout<<s[3];

控制台输出

3

好,其实string还有一个成员函数const char &at(int n)const;用法类似

	string s = "0123456789";
	cout<<s.at(3);

控制台输出

3

这两者的区别是operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。(所以用at()访问要安全一些)

那我们有了一个c++里面的string我们怎么用c语言里面的字符数组?

string类有如下2个成员函数

const char *data()const;//返回一个非null终止的c字符数组
const char *c_str()const;//返回一个以null终止的c字符串

eg.

	string s = "0123456789";
	cout<<s.c_str();

	string s = "0123456789";
	cout<<s.data();


控制台都输出

0123456789

注意,2者返回的都是const 数组!不可改!

但是可以这样修改

	string s = "0123456789";
	s[9] = '0';
	cout<<s;

控制台输出

 0123456780

接下来是对int copy(char *s, int n, int pos = 0) const;函数的实验

注意,在函数原型中 char *s,意味着我们要用C语言中的原生数据类型即(char[])

s是指向被覆盖(注意是被覆盖)字符数组的指针,n是要覆盖字符的个数,pos是string中的第几个

eg.

	string s = "0123456789";
	char t[]="0000000000";
	s.copy(t,5,0);
	cout<<t;
控制台输出

0123400000

接下来是关于string类的特性实验。

string类的容量:

	string s = "0123456789";
	cout<<s.capacity();
控制台输出

  10

	string s;
	s.~string();
	cout<<s.capacity();

控制台输出

0

	string s = "0123456789";
	s.~string();
	cout<<s.capacity();

输出值或随机?(有哪位大佬懂的话请评论指导一下,谢谢)

还有一点就是c++中的string类无法像c语言里的字符数组靠'\0'截断.

	string s = "0123456789";
	s.at(3) = '\0';
	cout<<s<<endl;
	cout<<s.capacity();
控制台输出

012a456789

10


哦,还有一点...capacity()返回的是容量不是size,容量的意思是不用增加内存可以存放的大小(string可以自己增加内存)
int capacity()const;    //返回当前容量(即string中不必增加内存即可存放的元素个数)
int max_size()const;    //返回string对象中可存放的最大字符串的长度
int size()const;        //返回当前字符串的大小

	string s = "0123456789";
	cout<<s.capacity()<<endl;
	cout<<s.max_size()<<endl;
	cout<<s.size()<<endl;

输出

10

极大值

10

但是一般情况下capacity和size是一样的?(哪位大佬详细解释下这里面的玄机)

我查了下资料,发现普遍观点是这样

这个和底层的编译器实现有关,capacity好比是杯子,size好比是杯子里面的水,你分配时可以刚好分配一杯装满水的杯子,也可以让杯子比水大(看实现).

然后还发现一个函数length()效果和size()等价。

[这里有个实验代码和效果图可以去看一下http://blog.csdn.net/zz460833359/article/details/48064173]

还有,string类的size是可变的,resize()可以修改string类的size,(但是capacity不变)

eg.

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string s = "0123456789";
void display()
{
	cout<<s<<endl;
	cout<<"capacity:"<<s.capacity()<<endl;
	cout<<"max_size:"<<s.max_size()<<endl;
	cout<<"size:"<<s.size()<<endl;
}
int main()
{	
	display();
	s.resize(3);
	display();
	return 0;
}

控制台输出如下:

0123456789
capacity:10
max_size:1073741820
size:10
012
capacity:10
max_size:1073741820
size:3
我们发现resize重置了string的size相当于截断,但是capacity不会改变。

resize也可以这样用
void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分
然后判断string是否为空

bool empty()const;  

eg.

string s = "0123456789";
	if(s.empty())cout<<"empty";
	else 
	{
		cout<<"!empty"<<endl;
		s.resize(0);
		if(s.empty())cout<<"empty";
		else cout<<"!empty";
	}
控制台输出

!empty

empty

关于读入

<span style="white-space:pre">	</span>string s;
	cin>>s;
	cout<<"s:"<<s;	
Input:

0123456789

Output:

0123456789


Input

012  345  456

Output

012

我们发现直接这样读入遇到空格、回车等会中断。

如果我们要读入整行(行输入)怎么办?C语言中有gets()但是要求是char*

c++中我们如何处理?

	getline(cin,s);
	cout<<"s:"<<s;	

getline(输入流,变量);

Input:

0123456789

Output:

0123456789


Input:

012 456  789

Output:

012 456  789


好的,今天就到这里,敬请期待..

————————————————————————

版权声明 (c) copy right. http://blog.csdn.net/qq_33583069

转载请注明出处,未经许可不允许直接使用,违者必究.

出于对作者劳动成果的尊重,如果您觉得对您有用请在下方

点个赞,或者评论,如果文章中有不足之处可以提出修改意见。

谢谢:)                               by.Lucifinil 2016.8.10

参考资料

[1] http://blog.csdn.net/qq_33583069/article/details/52171689

[2] http://www.cnblogs.com/lanxuezaipiao/p/3704578.html

[3] http://bbs.csdn.net/topics/390343778

[4] http://blog.csdn.net/zz460833359/article/details/48064173

[5]http://blog.csdn.net/zz460833359/article/details/48064283


相关文章:

  • Python中dict详解
  • Python 函数参数
  • Python高级特性之切片
  • Python 模块
  • Python 简易TCP客户端
  • Python 简易UDP客户端/服务端
  • Python TCP 服务端
  • python socket编程详细介绍
  • 关于ctrl组合键,你知道多少?
  • [python开发模拟netcat工具] BHPnet
  • 算法讲解之Dynamic Programing —— 区间DP [变形:环形DP]
  • codevs 3304 水果姐逛水果街Ⅰ 题解
  • 算法讲解之Dynamic Programing —— 背包DP [资源分配问题]
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】
  • Lonlife-ACM 1014 - Absolute Defeat [差分]
  • 0基础学习移动端适配
  • C++类中的特殊成员函数
  • conda常用的命令
  • css的样式优先级
  • django开发-定时任务的使用
  • Docker 笔记(2):Dockerfile
  • IP路由与转发
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java精华积累:初学者都应该搞懂的问题
  • java中的hashCode
  • Laravel 中的一个后期静态绑定
  • leetcode讲解--894. All Possible Full Binary Trees
  • Python学习笔记 字符串拼接
  • Vue学习第二天
  • 百度地图API标注+时间轴组件
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 带你开发类似Pokemon Go的AR游戏
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 移动端高清、多屏适配方案
  • ​学习一下,什么是预包装食品?​
  • # Panda3d 碰撞检测系统介绍
  • (39)STM32——FLASH闪存
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (一)基于IDEA的JAVA基础10
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .CSS-hover 的解释
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET框架
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @property括号内属性讲解
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)