C++之string类
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对象中单字符的处理
函数名称 | 返回值 |
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.综合实例
#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;
}
#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;
}
#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;
}
转载于:https://www.cnblogs.com/engineerLF/p/5393133.html
C++之string类相关推荐
- C++ 笔记(22)— STL string 类(字符串赋值、访问、拼接、查找、翻转、大小写转换)
1. 实例化和赋值 STL string #include <string> #include <iostream>int main () {using namespace s ...
- java string改变的影响_为什么Java的string类要设成immutable(不可变的)
最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...
- C++——String类超详细介绍
(欢迎及时指正错误!谢谢) STL的含义:标准模板库 STL的内容: 容器:数据的仓库 算法:与数据结构相关的算法.通用的算法(和数据结构无关) 注:熟悉常用的算法 sort reverse 迭代器 ...
- 标准C++中的string类的用法总结
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...
- c++ string replace_JAVA应用程序开发之String类常用API
[本文详细介绍了JAVA应用开发中的String类常用API,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 API ( Application Interface 应用程序接口)是类中提供的接口, ...
- javascript:为string类添加三个成员,实现去左,右,及所有空格
<script language="JavaScript"> //此处为string类添加三个成员 String.prototype.Trim = func ...
- 字符串(string类)
[1]String类基本函数如何实现? 示例代码如下: 1 #include<iostream> 2 #include<assert.h> 3 #include<stri ...
- 交换变量和String类初始化:JAVA入门基础
本文主要介绍了变量交换.String类初始化.字符串的基本操作.变量交换详解介绍了两个变量是如何交换的,通过例子理解这个用法. 一.交换变量 1.什么是交换变量 例如用户输入a.b的值分别3,9的整数 ...
- 带你进入String类的易错点和底层本质分析!
来源:https://my.oschina.net/liboware/blog/5076245 字符串拼接及创建的案例分析 案例一 String a = "test"; Strin ...
- string类具体用法
string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...
最新文章
- python中文软件-Python
- C#访问Access和Win7 64位下可能遇到的 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0” 提供程序 问题
- python量化投资培训清华大学深研院_GitHub - CatsJuice/quantitative-investment-learning: 使用Python进行量化投资的学习报告...
- 温商机器人企业_7家温商企业上榜“中国企业500强”
- 线性代数:特征值有重根时,相同特征值对应的不同特征向量顺序能交换吗?
- 浅谈动态规划和分治、贪心算法的区别
- 无人驾驶(再谈基于camera的高精度地图)
- 分享一套jquery视频教程
- Keras深度学习实战(31)——构建电影推荐系统
- ZZULIOJ部分题目解答
- wegame饥荒一直登录中_PC饥荒本地双人(最多三人)
- matlab伏安特性曲线的图,电源伏安特性曲线的意义详细解析
- 印度比中国可怕在哪里?一能力或成超越中国的秘密武器
- 这些行业高薪职位最多
- 【攻防世界WEB】难度三星9分入门题(上):simple_js、mfw
- Nginx反向代理服务器解决负责均衡问题
- 放大电路中的反馈-反馈的基本概念及判断方法
- 关于Android应用开发的一些安全注意事项
- sqli-labs 1~4 多命通关攻略
- 解决【react-native init awesomeproject没反应】
热门文章
- tf.layers.Dense与 tf.layers.dense的区别
- 怎么点亮段码屏_段码液晶屏有鬼影怎么处理?
- 打印表格_表格怎么打印出来
- mysql 5.1 innodb trx_mysql 优化innodb_flush_log_at_trx_commit的案例介绍
- signature=c58a3c5e53e2eed44d09cd8589207f96,合同英语
- mysql二维数组vb_VBA链接MYSQL的帮助类
- java两个线程交替执行
- 【企业管理】2020年的经营关键词
- 《系统集成项目管理工程师》必背100个知识点-36范围变更的遇到的问题
- Linux系统中软链接与硬链接使用特点