1.String对象的初始化

     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 s1 = "Hello";  string s2 = "world" ;
string s3 = s1 + ", " + "world" ;    // 正确
string s4 = "Hello" + ", " + s2 ;    // 错误
③string::size_type
       成员函数size()返回的值不是int型的,而是size_type()类型的;任何存储string的size操作结果的变量必须是string::size_type类型的,特别重要的是,不要将size的返回值赋给整型类型。string::size_type类型在不同的机器上长度是不同的,并非是固定的,但是只要你使用了这个类型,就使你的程序适合这个机器,与实际机器匹配。但是使用int类型的时候,如果你的string:size_type长度刚好和int类型匹配,那么结果正确,但是如果二者不相同(比如换平台了),那么结果就完全不一样了。
string s1 = "hello world";
for(string::size_type i=0;i<=(s1.size()-1);i++){  cout<<s1[i]<<endl;

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中,以换行符'\n'分开。

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()
#include"stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int main( )
{string str1 ( "1234567890" );basic_string <char>::iterator str_Iter;char array1 [20] = {0};char array2 [10] = {0};basic_string <char>:: pointer array1Ptr = array1;basic_string <char>:: value_type *array2Ptr = array2;cout << "The original string str1 is: ";for ( str_Iter = str1.begin( ); str_Iter != str1.end( ); str_Iter++ )cout << *str_Iter;cout << endl;basic_string <char>:: size_type nArray1;nArray1 = str1.copy ( array1Ptr , 12 );  //至多复制12个字符,默认从0开始cout << "The number of copied characters in array1 is: " << nArray1<< endl;cout << "The copied characters array1 is: " << array1Ptr << endl;basic_string <char>:: size_type nArray2;nArray2 = str1.copy ( array2Ptr , 5 , 6 );//从索引6开始,至多复制5个字符 cout << "The number of copied characters in array2 is: " << nArray2 << endl;cout << "The copied characters array2 is: " << array2Ptr << endl;string str2(str1,2,3);//还可以使用的一种复制方法,从索引2开始复制3个字符return 0;
}
       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 << '\n';return 0;
}


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


参考
        1.string中c_str(),data()和copy(p,n)的用法
         2.标准C++中的string类的用法总结

转载于:https://www.cnblogs.com/engineerLF/p/5393133.html

C++之string类相关推荐

  1. C++ 笔记(22)— STL string 类(字符串赋值、访问、拼接、查找、翻转、大小写转换)

    1. 实例化和赋值 STL string #include <string> #include <iostream>int main () {using namespace s ...

  2. java string改变的影响_为什么Java的string类要设成immutable(不可变的)

    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...

  3. C++——String类超详细介绍

    (欢迎及时指正错误!谢谢) STL的含义:标准模板库 STL的内容: 容器:数据的仓库 算法:与数据结构相关的算法.通用的算法(和数据结构无关) 注:熟悉常用的算法 sort  reverse 迭代器 ...

  4. 标准C++中的string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  5. c++ string replace_JAVA应用程序开发之String类常用API

    [本文详细介绍了JAVA应用开发中的String类常用API,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 API ( Application Interface 应用程序接口)是类中提供的接口, ...

  6. javascript:为string类添加三个成员,实现去左,右,及所有空格

    <script language="JavaScript">    //此处为string类添加三个成员    String.prototype.Trim = func ...

  7. 字符串(string类)

    [1]String类基本函数如何实现? 示例代码如下: 1 #include<iostream> 2 #include<assert.h> 3 #include<stri ...

  8. 交换变量和String类初始化:JAVA入门基础

    本文主要介绍了变量交换.String类初始化.字符串的基本操作.变量交换详解介绍了两个变量是如何交换的,通过例子理解这个用法. 一.交换变量 1.什么是交换变量 例如用户输入a.b的值分别3,9的整数 ...

  9. 带你进入String类的易错点和底层本质分析!

    来源:https://my.oschina.net/liboware/blog/5076245 字符串拼接及创建的案例分析 案例一 String a = "test"; Strin ...

  10. string类具体用法

    string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...

最新文章

  1. python中文软件-Python
  2. C#访问Access和Win7 64位下可能遇到的 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0” 提供程序 问题
  3. python量化投资培训清华大学深研院_GitHub - CatsJuice/quantitative-investment-learning: 使用Python进行量化投资的学习报告...
  4. 温商机器人企业_7家温商企业上榜“中国企业500强”
  5. 线性代数:特征值有重根时,相同特征值对应的不同特征向量顺序能交换吗?
  6. 浅谈动态规划和分治、贪心算法的区别
  7. 无人驾驶(再谈基于camera的高精度地图)
  8. 分享一套jquery视频教程
  9. Keras深度学习实战(31)——构建电影推荐系统
  10. ZZULIOJ部分题目解答
  11. wegame饥荒一直登录中_PC饥荒本地双人(最多三人)
  12. matlab伏安特性曲线的图,电源伏安特性曲线的意义详细解析
  13. 印度比中国可怕在哪里?一能力或成超越中国的秘密武器
  14. 这些行业高薪职位最多
  15. 【攻防世界WEB】难度三星9分入门题(上):simple_js、mfw
  16. Nginx反向代理服务器解决负责均衡问题
  17. 放大电路中的反馈-反馈的基本概念及判断方法
  18. 关于Android应用开发的一些安全注意事项
  19. sqli-labs 1~4 多命通关攻略
  20. 解决【react-native init awesomeproject没反应】

热门文章

  1. tf.layers.Dense与 tf.layers.dense的区别
  2. 怎么点亮段码屏_段码液晶屏有鬼影怎么处理?
  3. 打印表格_表格怎么打印出来
  4. mysql 5.1 innodb trx_mysql 优化innodb_flush_log_at_trx_commit的案例介绍
  5. signature=c58a3c5e53e2eed44d09cd8589207f96,合同英语
  6. mysql二维数组vb_VBA链接MYSQL的帮助类
  7. java两个线程交替执行
  8. 【企业管理】2020年的经营关键词
  9. 《系统集成项目管理工程师》必背100个知识点-36范围变更的遇到的问题
  10. Linux系统中软链接与硬链接使用特点