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

来源:互联网 发布:金螳螂五星级酒店知乎 编辑:程序博客网 时间:2024/05/20 07:54

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

#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


1 0