【C++】C++string类总结
一、string的初始化
首先,为了在程序中使用string类型,必须包含头文件 <string>。如下:
#include <string>
注意这里不是string.h,string.h是C字符串头文件。
string类是一个模板类,位于名字空间std中,通常为方便使用还需要增加:
using namespace std;
声明一个字符串变量很简单:
string str;
测试代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <iostream>#include <string>usingnamespacestd;intmain ( ){    string str;  //定义了一个空字符串str    str = "Hello world";   // 给str赋值为"Hello world"    charcstr[] = "abcde";  //定义了一个C字符串    string s1(str);       //调用复制构造函数生成s1,s1为str的复制品    cout<<s1<<endl;    string s2(str,6);     //将str内,开始于位置6的部分当作s2的初值    cout<<s2<<endl;    string s3(str,6,3);  //将str内,开始于6且长度顶多为3的部分作为s3的初值        cout<<s3<<endl;    string s4(cstr);   //将C字符串作为s4的初值    cout<<s4<<endl;    string s5(cstr,3);  //将C字符串前3个字符作为字符串s5的初值。    cout<<s5<<endl;    string s6(5,'A');  //生成一个字符串,包含5个'A'字符    cout<<s6<<endl;    string s7(str.begin(),str.begin()+5); //区间str.begin()和str.begin()+5内的字符作为初值    cout<<s7<<endl;    return0;} | 
程序执行结果为:
Hello world
world
wor
abcde
abc
AAAAA
Hello
二、string的比较等操作
你可以用 ==、>、<、>=、<=、和!=比较字符串,可以用+或者+=操作符连接两个字符串,并且可以用[]获取特定的字符。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream>#include <string>usingnamespacestd;intmain(){    string str;    cout << "Please input your name:"<<endl;    cin >> str;    if( str == "Li")   // 字符串相等比较        cout << "you are Li!"<<endl;    elseif( str != "Wang")  // 字符串不等比较        cout << "you are not Wang!"<<endl;    elseif( str < "Li")     // 字符串小于比较,>、>=、<=类似        cout << "your name should be ahead of Li"<<endl;    else        cout << "your name should be after of Li"<<endl;    str += ", Welcome!";  // 字符串+=    cout << str<<endl;    for(inti = 0 ; i < str.size(); i ++)        cout<<str[i];  // 类似数组,通过[]获取特定的字符    return0;} | 
程序执行结果为:
Please input your name:
Zhang↙
you are not Wang!
Zhang, Welcome!
Zhang, Welcome!
上例中,“ cout<< str[i]; ”可换为: cout<< str.at(i);
三、string特性描述
可用下列函数来获得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填充不足的部分
测试代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream>#include <string>usingnamespacestd;intmain(){    string str;        if(str.empty())        cout<<"str is NULL."<<endl;        else        cout<<"str is not NULL."<<endl;    str = str + "abcdefg";    cout<<"str is "<<str<<endl;        cout<<"str's size is "<<str.size()<<endl;       cout<<"str's capacity is "<<str.capacity()<<endl;    cout<<"str's max size is "<<str.max_size()<<endl;    cout<<"str's length is "<<str.length()<<endl;    str.resize(20,'c');    cout<<"str is "<<str<<endl;    str.resize(5);    cout<<"str is "<<str<<endl;    return0;} | 
程序执行结果为:
str is NULL.
str is abcdefg
str's size is 7
str's capacity is 15
str's max size is 4294967294
str's length is 7
str is abcdefgccc
str is abcde
四、string的查找
由于查找是使用最为频繁的功能之一,string提供了非常丰富的查找函数:(注:string::npos)
size_type find( const basic_string &str, size_type index ); //返回str在字符串中第一次出现的位置(从index开始查找),如果没找到则返回string::npos
size_type find( const char *str, size_type index ); // 同上
size_type find( const char *str, size_type index, size_type length ); //返回str在字符串中第一次出现的位置(从index开始查找,长度为length),如果没找到就返回string::npos
size_type find( char ch, size_type index ); // 返回字符ch在字符串中第一次出现的位置(从index开始查找),如果没找到就返回string::npos
注意:查找字符串a是否包含子串b,不是用 strA.find(strB) > 0 而是 strA.find(strB) != string:npos 这是为什么呢?(初学者比较容易犯的一个错误)本部分参考自web100与luhao1993
先看下面的代码
int idx = str.find("abc");
if (idx == string::npos);
上述代码中,idx的类型被定义为int,这是错误的,即使定义为 unsigned int 也是错的,它必须定义为 string::size_type。npos 是这样定义的: static const size_type npos = -1; 因为 string::size_type (由字符串配置器 allocator 定义) 描述的是 size,故需为无符号整数型别。因为缺省配置器以型别 size_t 作为 size_type,于是 -1 被转换为无符号整数型别,npos 也就成了该型别的最大无符号值。不过实际数值还是取决于型别 size_type 的实际定义。不幸的是这些最大值都不相同。事实上,(unsigned long)-1 和 (unsigned short)-1 不同(前提是两者型别大小不同)。因此,比较式 idx == string::npos 中,如果 idx 的值为-1,由于 idx 和字符串string::npos 型别不同,比较结果可能得到 false。因此要想判断 find()等查找函数的结果是否为npos,最好的办法是直接比较。
测试代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include<iostream>#include<string>usingnamespacestd;intmain(){    intloc;    string s="study hard and make progress everyday! every day!!";    loc=s.rfind("make",10);    cout<<"the word make is at index"<<loc<<endl;//-1表示没找到    loc=s.rfind("make");//缺省状态下,从最后一个往前找    cout<<"the word make is at index"<<loc<<endl;    loc=s.find_first_of("day");    cout<<"the word day(first) is at index "<<loc<<endl;    loc=s.find_first_not_of("study");    cout<<"the first word not of study is at index"<<loc<<endl;    loc=s.find_last_of("day");    cout<<"the last word of day is at index"<<loc<<endl;    loc=s.find("day");//缺陷状态下从第一个往后找    cout<<loc;    return0;} | 
运行结果:

五、其他常用函数
string &insert(int p,const string &s); //在p位置插入字符串s
string &replace(int p, int n,const char *s); //删除从p开始的n个字符,然后在p处插入串s
string &erase(int p, int n); //删除p开始的n个字符,返回修改后的字符串
string substr(int pos = 0,int n = npos) const; //返回pos开始的n个字符组成的字符串
void swap(string &s2); //交换当前字符串与s2的值
string &append(const char *s); //把字符串s连接到当前字符串结尾
void push_back(char c) //当前字符串尾部加一个字符c
const char *data()const; //返回一个非null终止的c字符数组,data():与c_str()类似,用于string转const char*其中它返回的数组是不以空字符终止,
const char *c_str()const; //返回一个以null终止的c字符串,即c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,用于string转const char*
测试代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iostream>#include <string>usingnamespacestd;intmain(){    string str1 = "abc123defg";    string str2 = "swap!";    cout<<str1<<endl;    cout<<str1.erase(3,3)<<endl;  //从索引3开始的3个字符,即删除掉了"123"    cout<<str1.insert(0,"123")<<endl; //在头部插入    cout<<str1.append("123")<<endl;   //append()方法可以添加字符串    str1.push_back('A');  //push_back()方法只能添加一个字符    cout<<str1<<endl;    cout<<str1.replace(0,3,"hello")<<endl; //即将索引0开始的3个字符替换成"hello"    cout<<str1.substr(5,7)<<endl; //从索引5开始7个字节    str1.swap(str2);    cout<<str1<<endl;    constchar* p = str.c_str();    printf("%s\n",p);    return0;} | 
程序执行结果为:
abc123defg
abcdefg
123abcdefg
123abcdefg123
123abcdefg123A
helloabcdefg123A
abcdefg
swap!
swap!
【C++】C++string类总结的更多相关文章
- 标准库String类
		下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ... 
- 自己实现简单的string类
		1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ... 
- C++ string类的实现
		c++中string类的实现 今天面试被考到了, 全给忘记了!!! //string类的实现 #include <iostream> #include <string.h> ... 
- String类的功能
		String类 标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ... 
- java基础复习:final,static,以及String类
		2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ... 
- String类和StringBuffer类的区别
		首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ... 
- 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明
		Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ... 
- 标准C++中的string类的用法总结
		标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ... 
- String类常用方法
		1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ... 
- 运用String类实现一个模拟用户登录程序
		package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ... 
随机推荐
- [转]Linux中python3.6+ipython+Jupyter Notebook环境
			python3.6安装 下载python安装包,这里下载的最新的3.6.1版本 https://www.python.org/ftp/python/3.6.1/ 将安装包上传到服务器并解压 tar z ... 
- HTML与CSS:结构与表现
			在HTML和CSS里存在着部分重复的功能,例如两者都可以设定一段文字的字体属性.既然如此,为啥还要CSS呢(至少,为啥CSS里存在着和HTML标签属性重复的东西呢)? 这是因为,HTML和CSS的用途 ... 
- WEB 性能优化导图
			看了一下网上对于web性能优化的一些帖子,不是很直观,花了点时间画了一个思维导图. refers: https://segmentfault.com/a/1190000011936772 https: ... 
- windows下的拷贝利器robocopy
			robocopy xxcopy http://www.cnblogs.com/zhanglei1371/p/6724167.html [转载]robocopy的用法 经常进行文件管理操作的朋友们,不满 ... 
- 你云我云•兄弟夜谈会 第三季 企业IT架构
			你云我云•兄弟夜谈会 第三季 企业IT架构 你云我云•兄弟夜谈会 第二季 5G 你云我云•兄弟夜谈会 第一季 企业云 0. 概况 时间:2019年2月23日 22:00~23:30 主题:企业IT架构 ... 
- 64 位 Windows 平台开发注意要点之文件系统重定向
			Program Files 的重定向 很多开发人员都知道,在 64 位 Windows 系统上,32 位程序是无法获取得到 C:\Program Files 的完整路径的,只能获取到 C:\Progr ... 
- Flask--WTForms
			简介 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装:pip3 install wtforms 用户登录注册示例 1. 用户登录 当用户登录时候,需要对用 ... 
- mysql数据库的理解
			1.索引结构原理: 普通的Btree(binary search tree)就是二叉树,如下图 B+ Tree索引类型则是二叉树的升级版,每个节点存的是 <num ,最后存排序的ROWID Ha ... 
- String 相关
			1. 输出结果为 true,"hello" + 1 在编译期间就被优化成了 "hello1",因此在运行期间,变量 a 和变量 b 指向的是同一个对象 Stri ... 
- GetBuffer 与ToArray区别,解决问题场景
			GetBuffer 是把 stream 中的 buffer 的引用传递出来, buffer 的大小是由 stream的 Capacity来决定的. 因为只是地址的引用传递,所以 GetBuffer() ... 
