C++之string类 1.String对象的初始化 2.String对象的读取 3.String对象的常用操作 4.String对象中单字符的处理 5.成员函数c_str(),data(),copy()的用法 6.常用成员函数 7.综合实例

     string    s1;                              默认构造函数,s1为空串
     string    s4(n, 'c');                   将s4初始化为字符c的n个副本
     string    s3(const char,int N)
string s3(const char*,int N);  将s3初始化为一个c常量字符串的前N个字符(至多N个)
     string    s2(s1);                           将s2初始化s1的一个副本。
     string    s5(const string &,int n=0,int N)     s5初始化为常量字符串的以索引n开头的N个字符。
     string    s6(a+6,a+10)        其中a=char[N].以a中[6,10)数据构造。此时c+6,c+10均为指针类型,即此时模板参数为指针类型,故s5+6,s5+10无意义而要用如上的&s5[6],&s5[10](例如string的部分子串)

  注意:字符串字面值和string类型不是同一种类型

2.String对象的读取

①iostream标准库读写
           cin>>s从标准输入读取string,并存入串s中。读取并忽略开头的空白字符,读取直至再次遇到空白字符(空格,换行,制表)为止。可以作为条件语句

②getline读取整行文本
      getline(cin,line)-->getline(cin,word,':')。需要两个参数,1个istream,1个string对象。可以用作循环或if控制语句。getline不忽略开头和结尾的空白字符,它只要遇到换行符(即使在开头)停止读入并返回(不读入换行符)。换行符不存储在string对象中。可以指定结束符如‘:’,同样结束符不被读取,但是换行符此时被读取。这个语句不能作为判断语句使用。

3.String对象的常用操作

    s.size()               返回s中字符的个数(成员函数)
    s.empty()            判断字符串是否为空(成员函数)
    s[n]                    返回s中位置为n的字符,位置从0开始计数
    s1 + s2               拼接字符串
    s1 = s2               将s1替换成s2的副本
    s1 == s2                比较s1和s2的内容,如果相同,返回true
    =,!=,< , <=,>, >= 保持其原有意思,比较字符串是否相等,是否大于....注意小写字母大于大写字母
①判断为空
      一种使用s.size和0进行比较,一种使用s.empty()来进行判断

②字符串拼接
         当进行string对象和字符串字面值混合连接时,+操作符的左右操作数至少有一个是string类型的。(连接方向从左至右)
③string::size_type
       成员函数size()返回的值不是int型的,而是size_type()类型的;任何存储string的size操作结果的变量必须是string::size_type类型的,特别重要的是,不要将size的返回值赋给整型类型。string::size_type类型在不同的机器上长度是不同的,并非是固定的,但是只要你使用了这个类型,就使你的程序适合这个机器,与实际机器匹配。但是使用int类型的时候,如果你的string:size_type长度刚好和int类型匹配,那么结果正确,但是如果二者不相同(比如换平台了),那么结果就完全不一样了。

     string对象下标是从0开始的,若为空则不含s[0]。任何可产生整型值的表达式都可以作为下标操作符[]的索引。(不过string对象的索引最好也是string :: size_type类型,如上)

4.String对象中单字符的处理

    先包含头文件cctype,常用的函数如下: 
函数名称 返回值
isalnum() 如果参数是字母数字,即字母或数字,该函数返回true
isalpha() 如果参数是字母,该函数返回真
isblank() 如果参数是空格或水平制表符,该函数返回true
iscntrl() 如果参数是控制字符,该函数返回true
isdigit() 如果参数是数字(0~9),该函数返回true
isgraph() 如果参数是除空格之外的打印字符,该函数返回true
islower() 如果参数是小写字母,该函数返回true
isprint() 如果参数是打印字符(包括空格),该函数返回true
ispunct() 如果参数是标点符号,该函数返回true
isspace()

如果参数是标准空白字符,如空格、进纸、换行符、回车

、水平制表符或者垂直制表符,该函数返回true

isupper() 如果参数是大写字母,该函数返回true
isxdigit() 如果参数是十六进制的数字,即0~9、a~f、A~F,该函数返回true
tolower() 如果参数是大写字符,则返回其小写,否则返回该参数
toupper() 如果参数是小写字母,则返回其大写,否则返回该参数

5.成员函数c_str(),data(),copy()的用法

    c_str()返回一个const char*类型的指针,指向以空字符终止的字符数组。不需要手动释放或删除这个指针。数组的数据是临时的,一旦数组的元素被改变,原数据就会失效。因此要么先转换,要么把它的数据复制到用户自己可以管理的内存中。

const char* c;
string s="1234";
c = s.c_str(); 
cout<<c<<endl; //输出:1234
s="abcd";
cout<<c<<endl; //输出:abcd
   c = s.c_str()不是一个好习惯。既然c指针指向的内容容易失效,我们应该用strcpy函数把数据复制出来

char* c=new char[20];
string s="1234";
//c = s.c_str(); 
strcpy(c,s.c_str());
cout<<c<<endl; //输出:1234
s="abcd";
cout<<c<<endl; //输出:1234
    data():与c_str()类似,但是返回的数组不以空字符终止。

    copy(char*p,n,size_type _Off = 0):从string类型对象中至多复制n个字符到字符指针p指向的空间中。默认从首字符开始,但是也可以指定开始的位置。用户要确保p指向的空间足够保存n个字符。同时这里也对比了另外一种用string类的构造函数的复制方法。具体见实例7.2。


6.常用成员函数

string类的字符操作:

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

const char &at(int n)const;

char &operator[](int n);

char &at(int n);

operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。

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

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

int copy(char *s, int n, int pos = 0)const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目

 

 

string的特性描述:

int capacity()const;    //返回当前容量(即string中不必增加内存即可存放的元素个数)

int max_size()const;    //返回string对象中可存放的最大字符串的长度

int size()const;        //返回当前字符串的大小

int length()const;       //返回当前字符串的长度

bool empty()const;        //当前字符串是否为空

void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分

 

string类的输入输出操作:

string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作。

函数getline(istream &in,string &s);用于从输入流in中读取字符串到s中,以换行符' '分开。

 

string的赋值:

string &operator=(const string&s);//把字符串s赋给当前字符串

string &assign(const char *s);//用c类型字符串s赋值

string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值

string &assign(const string &s);//把字符串s赋给当前字符串

string &assign(int n,char c);//用n个字符c赋值给当前字符串

string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串

string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串

 

string的连接:

string &operator+=(const string&s);//把字符串s连接到当前字符串的结尾

string &append(const char *s);            //把c类型字符串s连接到当前字符串结尾

string &append(const char *s,int n);//把c类型字符串s的前n个字符连接到当前字符串结尾

string &append(const string&s);    //同operator+=()

string &append(const string &s,int pos,int n);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾

string &append(int n,char c);        //在当前字符串结尾添加n个字符c

string &append(const_iterator first,const_iterator last);//把迭代器first和last之间的部分连接到当前字符串的结尾

 

 

string的比较:

bool operator==(const string &s1,conststring &s2)const;//比较两个字符串是否相等

运算符">","<",">=","<=","!="均被重载用于字符串的比较;

int compare(const string &s) const;//比较当前字符串和s的大小

int compare(int pos, int n,const string&s)const;//比较当前字符串从pos开始的n个字符组成的字符串与s的大小

int compare(int pos, int n,const string&s,int pos2,int n2)const;//比较当前字符串从pos开始的n个字符组成的字符串与s中pos2开始的n2个字符组成的字符串的大小

int compare(const char *s) const;

int compare(int pos, int n,const char *s)const;

int compare(int pos, int n,const char *s,int pos2) const;

compare函数在>时返回1,<时返回-1,==时返回0 

 

 

string的子串:

string substr(int pos = 0,int n = npos)const;//返回pos开始的n个字符组成的字符串

 

string的交换:

void swap(string &s2);    //交换当前字符串与s2的值

 

 

string类的查找函数:


//查找成功时返回所在位置,失败返回string::npos的值

int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置

int find(const char *s, int pos = 0)const;//从pos开始查找字符串s在当前串中的位置

int find(const char *s, int pos, int n)const;//从pos开始查找字符串s中前n个字符在当前串中的位置

int find(const string &s, int pos = 0)const;//从pos开始查找字符串s在当前串中的位置


//从pos开始从后向前查找字符c在当前串中的位置

int rfind(char c, int pos = npos) const;

int rfind(const char *s, int pos = npos)const;

int rfind(const char *s, int pos, int n =npos) const;

int rfind(const string &s,int pos =npos) const;

//从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,成功返回所在位置,失败时返回string::npos的值

int find_first_of(char c, int pos = 0)const;//从pos开始查找字符c第一次出现的位置

int find_first_of(const char *s, int pos =0) const;

int find_first_of(const char *s, int pos,int n) const;

int find_first_of(const string &s,intpos = 0) const;

//从pos开始查找当前串中第一个在s的前n个字符组成的数组里的字符的位置。查找失败返回string::npos

int find_first_not_of(char c, int pos = 0)const;

int find_first_not_of(const char *s, intpos = 0) const;

int find_first_not_of(const char *s, intpos,int n) const;

int find_first_not_of(const string&s,int pos = 0) const;

//从当前串中查找第一个不在串s中的字符出现的位置,失败返回string::npos

int find_last_of(char c, int pos = npos)const;

int find_last_of(const char *s, int pos =npos) const;

int find_last_of(const char *s, int pos,int n = npos) const;

int find_last_of(const string &s,intpos = npos) const;

int find_last_not_of(char c, int pos =npos) const;

int find_last_not_of(const char *s, int pos= npos) const;

int find_last_not_of(const char *s, intpos, int n) const;

int find_last_not_of(const string&s,int pos = npos) const;

//find_last_of和find_last_not_of与find_first_of和find_first_not_of相似,只不过是从后向前查找

 

 

string类的替换函数:

string &replace(int p0, int n0,constchar *s);//删除从p0开始的n0个字符,然后在p0处插入串s

string &replace(int p0, int n0,constchar *s, int n);//删除p0开始的n0个字符,然后在p0处插入字符串s的前n个字符

string &replace(int p0, int n0,conststring &s);//删除从p0开始的n0个字符,然后在p0处插入串s

string &replace(int p0, int n0,conststring &s, int pos, int n);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符

string &replace(int p0, int n0,int n,char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c

string &replace(iterator first0,iterator last0,const char *s);//把[first0,last0)之间的部分替换为字符串s

string &replace(iterator first0,iterator last0,const char *s, int n);//把[first0,last0)之间的部分替换为s的前n个字符

string &replace(iterator first0,iterator last0,const string &s);//把[first0,last0)之间的部分替换为串s

string &replace(iterator first0,iterator last0,int n, char c);//把[first0,last0)之间的部分替换为n个字符c

string &replace(iterator first0,iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之间的部分替换成[first,last)之间的字符串

 

 

string类的插入函数:

string &insert(int p0, const char *s);

string &insert(int p0, const char *s,int n);

string &insert(int p0,const string&s);

string &insert(int p0,const string&s, int pos, int n);

//前4个函数在p0位置插入字符串s中pos开始的前n个字符

string &insert(int p0, int n, charc);//此函数在p0处插入n个字符c

iterator insert(iterator it, char c);//在it处插入字符c,返回插入后迭代器的位置

void insert(iterator it, const_iteratorfirst, const_iterator last);//在it处插入[first,last)之间的字符

void insert(iterator it, int n, char c);//在it处插入n个字符c

 

 

string类的删除函数

iterator erase(iterator first, iteratorlast);//删除[first,last)之间的所有字符,返回删除后迭代器的位置

iterator erase(iterator it);//删除it指向的字符,返回删除后迭代器的位置

string &erase(int pos = 0, int n =npos);//删除pos开始的n个字符,返回修改后的字符串

 

 

string类的迭代器处理:

string类提供了向前和向后遍历的迭代器iterator,迭代器提供了访问各个字符的语法,类似于指针操作,迭代器不检查范围。

用string::iterator或string::const_iterator声明迭代器变量,const_iterator不允许改变迭代的内容。常用迭代器函数有:

const_iterator begin()const;

iterator begin();                //返回string的起始位置

const_iterator end()const;

iterator end();                    //返回string的最后一个字符后面的位置

const_iterator rbegin()const;

iterator rbegin();                //返回string的最后一个字符的位置

const_iterator rend()const;

iterator rend();                    //返回string第一个字符位置的前面

rbegin和rend用于从后向前的迭代访问,通过设置迭代器string::reverse_iterator,string::const_reverse_iterator实现



7.综合实例


7.1去除字符串中的标点
#include <iostream>  
#include<string>  
#include<cctype>  
using namespace std;  
using std::string;  
int main()
{  
  string s,res;  
  cin>>s;  
  for(string::size_type index=0;index<s.size();index++){  
  if(!ispunct(s[index])) 
     res=res+s[index];    
  cout<<"strip the punctions:"<<res;  
  return 0;  
} 

7.2字符串的赋值之copy()

       string转化为char*: 常用的为data,c_str()都可以转换为const char*。至于要转换为char*,第一可以使用const_cast<char*>强制转换,第二可以使用如上的copy函数。

7.3  查找与替换
#include <iostream>
#include <string>
#include <cstddef>

int main ()
{
  std::string str ("The sixth sick sheik's sixth sheep's sick.");
  std::string key ("sixth");

  std::size_t found = str.rfind(key);
  if (found!=std::string::npos)
    str.replace (found,key.length(),"seventh");

  std::cout << str << '
';

  return 0;
}



Note: string::copy is potentially unsafe, consider. using string::_Copy_s instead.









参考