C++单元学习小结之标准库类型string
标准库类型string
string 类支持字符串对象的各种操作:
各种初始化方式,字符串之间的复制、比较、连接,查询字符串长度和判断字符串是否为空,访问字符串中的单个字符等。
使用string 类要包含头文件
简单使用举例:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1, s2; //创建两个空字符串对象
string s3 = "Hello, World!"; //创建s3,并初始化
string s4("I am ");
s2 = "Today"; //赋值
s1 = s3 + " " + s4; //字符串连接
s1 += " 5 "; //末尾追加
cout << s1 + s2 + "!" <<endl; //输出字符串内容
cout <<"Length of s1 is :" << s1.size() << endl;
//逐个输出s1中的字符
for (size_t i = 0; i < s1.size(); ++i)
cout << s1[i] <<" ";
}
输出样例:
Hello, World! I am 5 Today!
Length of s1 is :22
H e l l o , W o r l d ! I a m 5
对于上文中的size_t以及其他类似使用的相关拓展解释(来自资料):
size_t详细解释:
size_t在C语言中就有了。
它是一种“整型”类型,里面保存的是一个整数,就像int, long那样。这种整数用来记录一个大小(size)。size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。
通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型。
因为size_t类型的数据其实是保存了一个整数,所以它也可以做加减乘除,也可以转化为int并赋值给int类型的变量。
类似的还有wchar_t, ptrdiff_t。
wchar_t就是wide char type,“一种用来记录一个宽字符的数据类型”。
ptrdiff_t就是pointer difference type,“一种用来记录两个指针之间的距离的数据类型”。
通常,size_t和ptrdiff_t都是用typedef来实现的。你可能在某个头文件里面找到类似的语句:
typedef unsigned int size_t;
而wchar_t则稍有不同。在一些旧的编译器中,wchar_t也可能是用typedef来实现,但是新的标准中wchar_t已经是C/C++语言的关键字,wchar_t类型的地位已经和char, int的地位等同了。
在标准C/C++的语法中,只有int float char bool等基本的数据类型,至于size_t,或size_type都是以后的编程人员为了方便记忆所定义的一些便于理解的由基本数据类型的变体类型。
例如:typedef int size_t;定义了size_t为整型。
示例程序:
int i;//定义一个int类型的变量i
size_t size=sizeof(i);//用sizeof操作得到变量i的类型的大小
//这是一个size_t类型的值
//可以用来对一个size_t类型的变量做初始化
i=(int)size;//size_t类型的值可以转化为int类型的值
char c='a';//c保存了字符a,占一个字节
wchar_t wc=L'a';//wc保存了宽字符a,占两个字节
//注意'a'表示字符a,L'a'表示宽字符a
int arr[]={1,2,3,4,5};//定义一个数组
int *p1=&arr[0];//取得数组中元素的地址,赋值给指针
int *p2=&arr[3];
ptrdiff_t diff=p2-p1;//指针的减法可以计算两个指针之间相隔的元素个数
//所得结果是一个ptrdiff_t类型
i=(int)diff;//ptrdiff_t类型的值可以转化为int类型的值
定义和初始化string对象:
string的常用操作:
这几条我们在很多时候都很常用,有的时候也很好用。
关于输入输出流这里的函数是os,is,用来写入与读取数据,在之前我写到过关于C++ string 流stringstream的简单总结,与之类似但又有所不同:
C++ string 流stringstream:
istream是输入流,ostream是输出流,iostream是输入输出流,stringstream是基于c++字符串string的输入输出流。此外还有基于c类型char*流,输入流istrstream,输出流ostrstream,输入输出流strstream。
这里我们再进行一次举例:
string s;
stringstream ss;
ss<<2;
ss>>s;//将int转换为string
ss.clear();//使用stringstream来做转换时,最好使用完,进行ss.clear()操作
istringstream类用于执行C++风格的串流的输入操作。//它的作用是从string对象str中读取字符。遇空格结束:
string str ="I am boy";
string b;
istringstream in(str)
while(in >> b){
cout << b<<endl;//
}
//输出:I
am
boy
ostringstream类用于执行C风格的串流的输出操作。
//通过ostringstream实现任意类型转string:
ostringstream oss;
double a=2.21;
int b=4;
string str;
oss<<a<<"_"<<b<<endl;
str = oss.str();
//输出就是 2.21_4;
另外关于s.c_str(),代表转换,返回s中内容对应的C风格字符串首地址,有些时候我们在编写代码时要输出中文(如姓名),但是对于printf来说是不允许的,这时就考虑到使用该操作进行转换,使用cout也不可以(但还部分环境下编译器可以兼容)(我的电脑上codeblocks可以兼容,舍友的则不行)(版本与编译环境问题)
字符串字面值不是string类型,而是const char类型
可以将C风格的字符串直接赋给string对象,反之不可
用string对象的c_str()操作可以返回一个表示该string对象内容的C风格字符串,结果为const char类型,即C风格字符串的首地址
string s1 = "If you really want it.";
int x = strlen(s1); //Error
x = strlen(s1.c_str()); //OK
getline()函数:
两个参数:输入流对象和存放读入字符串的string对象
从指定输入流中读取内容,遇到换行符为止;将所读内容存入指定的string对象中,流中的换行符被读取并丢弃。
字符串的大小关系依照字典顺序定义且区分大小写字母:
string s1 = "hello";
string s2 = "hello world"; // s2 > s1
string s3 = "Hello"; // s3 < s1, s3 < s2
//H比h的字典序要小。
处理string对象中的字符:
使用下标运算符可以获取string对象中指定位置的字符,因此可以使用for循环或range for逐个处理string对象中的字符。
说到处理字符,单独有一个头文件包含了一类获取或改变字符特性的标准库函数:cctype
cctype头文件中的标准库函数:
像isalpha()函数(判断是否为字母),isalnum()函数(判断是否是字母或数字),tolower()函数(返回小写字母),toupper()(函数返回大写字母)等有时候使用起来都十分便利。