本文用来记录学习string过程中的收获,会不时更新。
string是c++标准库类型,表示可变长的字符序列,C语言中没有此类型。
1.头文件
使用string类型必须包含string头文件。
#include <string>
注意和
cstring
区分。
cstring
可以理解为
string.h
的升级版,它们包含原来C语言中的strcpy等函数。
2.定义和初始化string对象
常用的方法
string s1;//默认是一个空字符串""
string s2=s1;//s2是s1的副本
string s3(s2);//s3是s2的副本
string s4="hello world";//s4是字符串字面值的副本
string s5("hello world");//同s4
string s6(5,'h');//s6初始化为"hhhhh"
s2,s4初始化方式是拷贝初始化;s3,s5,s6是直接初始化。
3.读写
- 读写string
读取输入时,string对象会自动忽略开头的空白(空格,回车,制表),知道遇到下一处空白为止。于是当输入的是" hello world! “时,输出的却是"hello”。int main() { string s; cin>>s; cout<<s; }
-
getline 读取一整行
c++primer中写到
触发getline函数返回的那个换行符实际上被丢弃掉了,得到的string对象中并不包含该换行符。c++学习:字符串string
第三个参数是分隔符,可以自定义,默认是换行符。如:istream& getline (istream& is, string& str, char delim); istream& getline (istream& is, string& str);
int main() { string s; getline(cin,s,'g'); cout<<s; }
输入:today is a good day
输出:today is a
4.操作字符
-
toupper/tolower
可以进行大小写转换。但此函数仅适用于单个字符串,不能直接对字符串使用。可以结合transform转换整个字符串。如:
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string s; getline(cin,s,'r'); transform(s.begin(),s.end(),s.begin(),::toupper); cout<<s; }
输入:hello world
输出:HELLO WO
5.搜索操作
string类提供了6个不同的搜索函数,每个函数都有4个重载版本。每个搜索操作都返回一个string::size_type值,是一个无符号的长整数,如果搜索失败,则返回一个名为string::npos的常量。
- find函数完成最简单的搜索。它查找指定的字符串,若找到,则返回第一个匹配位置的下表,否则返回npos,并且搜索时对大小写敏感。
string s("to be or not to be this is a question"); cout<<s.find("is");
输出21,即"is"字符串第一次出现的位置。
然而实际上如果我们想查找的是单词is在句子中出现的位置该如何操作呢?
#include <iostream> #include <string> #include <cstring>//getchar() #include <algorithm> using namespace std; int main() { string word,s;//定义单词和句子 cin>>word; word=" "+word+" "; getchar();//消除输入word时空白符的影响。 getline(cin,s); s=" "+s+" "; cout<<s.find(word)-1; }
输出:23
上述程序在word和s前后都加上了一个空格,从而解决了这个问题。比先匹配字符串在判断是否为单独的单词要简洁。