关于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;
}
控制台输出如下:
0123456789capacity: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