一、string的初始化

首先,为了在程序中使用string类型,必须包含头文件 <string>。如下:

  1. #include <string>

注意这里不是string.h,string.h是C字符串头文件。

string类是一个模板类,位于名字空间std中,通常为方便使用还需要增加:

  1. using namespace std;

声明一个字符串变量很简单:

  1. string str;

测试代码:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main ( )
  5. {
  6. string str; //定义了一个空字符串str
  7. str = "Hello world"; // 给str赋值为"Hello world"
  8. char cstr[] = "abcde"; //定义了一个C字符串
  9. string s1(str); //调用复制构造函数生成s1,s1为str的复制品
  10. cout<<s1<<endl;
  11. string s2(str,6); //将str内,开始于位置6的部分当作s2的初值
  12. cout<<s2<<endl;
  13. string s3(str,6,3); //将str内,开始于6且长度顶多为3的部分作为s3的初值
  14. cout<<s3<<endl;
  15. string s4(cstr); //将C字符串作为s4的初值
  16. cout<<s4<<endl;
  17. string s5(cstr,3); //将C字符串前3个字符作为字符串s5的初值。
  18. cout<<s5<<endl;
  19. string s6(5,'A'); //生成一个字符串,包含5个'A'字符
  20. cout<<s6<<endl;
  21. string s7(str.begin(),str.begin()+5); //区间str.begin()和str.begin()+5内的字符作为初值
  22. cout<<s7<<endl;
  23. return 0;
  24. }

程序执行结果为:

Hello world

world

wor

abcde

abc

AAAAA

Hello

二、string的比较等操作

你可以用 ==、>、<、>=、<=、和!=比较字符串,可以用+或者+=操作符连接两个字符串,并且可以用[]获取特定的字符。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string str;
  7. cout << "Please input your name:"<<endl;
  8. cin >> str;
  9. if( str == "Li" ) // 字符串相等比较
  10. cout << "you are Li!"<<endl;
  11. else if( str != "Wang" ) // 字符串不等比较
  12. cout << "you are not Wang!"<<endl;
  13. else if( str < "Li") // 字符串小于比较,>、>=、<=类似
  14. cout << "your name should be ahead of Li"<<endl;
  15. else
  16. cout << "your name should be after of Li"<<endl;
  17. str += ", Welcome!"; // 字符串+=
  18. cout << str<<endl;
  19. for(int i = 0 ; i < str.size(); i ++)
  20. cout<<str[i]; // 类似数组,通过[]获取特定的字符
  21. return 0;
  22. }

程序执行结果为:

Please input your name:

Zhang↙

you are not Wang!

Zhang, Welcome!

Zhang, Welcome!

上例中,“ cout<< str[i]; ”可换为: cout<< str.at(i);

三、string特性描述

可用下列函数来获得string的一些特性:

  1. int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)
  1. int max_size()const; //返回string对象中可存放的最大字符串的长度
  1. int size()const; //返回当前字符串的大小
  1. int length()const; //返回当前字符串的长度
  1. bool empty()const; //当前字符串是否为空
  1. void resize(int len,char c); //把字符串当前大小置为len,多去少补,多出的字符c填充不足的部分

测试代码:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string str;
  7. if (str.empty())
  8. cout<<"str is NULL."<<endl;
  9. else
  10. cout<<"str is not NULL."<<endl;
  11. str = str + "abcdefg";
  12. cout<<"str is "<<str<<endl;
  13. cout<<"str's size is "<<str.size()<<endl;
  14.    cout<<"str's capacity is "<<str.capacity()<<endl;
  15. cout<<"str's max size is "<<str.max_size()<<endl;
  16. cout<<"str's length is "<<str.length()<<endl;
  17. str.resize(20,'c');
  18. cout<<"str is "<<str<<endl;
  19. str.resize(5);
  20. cout<<"str is "<<str<<endl;
  21. return 0;
  22. }

程序执行结果为:

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)

  1. size_type find( const basic_string &str, size_type index ); //返回str在字符串中第一次出现的位置(从index开始查找),如果没找到则返回string::npos
  1. size_type find( const char *str, size_type index ); // 同上
  1. size_type find( const char *str, size_type index, size_type length ); //返回str在字符串中第一次出现的位置(从index开始查找,长度为length),如果没找到就返回string::npos
  1. size_type find( char ch, size_type index ); // 返回字符ch在字符串中第一次出现的位置(从index开始查找),如果没找到就返回string::npos

注意:查找字符串a是否包含子串b,不是用 strA.find(strB) > 0 而是 strA.find(strB) != string:npos 这是为什么呢?(初学者比较容易犯的一个错误)本部分参考自web100luhao1993

  先看下面的代码

  1. int idx = str.find("abc");
  2. if (idx == string::npos);

  上述代码中,idx的类型被定义为int,这是错误的,即使定义为 unsigned int 也是错的,它必须定义为 string::size_type。npos 是这样定义的: static const size_type npos = -; 因为 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. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int main(){
  5. int loc;
  6. string s="study hard and make progress everyday! every day!!";
  7. loc=s.rfind("make",10);
  8. cout<<"the word make is at index"<<loc<<endl;//-1表示没找到
  9. loc=s.rfind("make");//缺省状态下,从最后一个往前找
  10. cout<<"the word make is at index"<<loc<<endl;
  11. loc=s.find_first_of("day");
  12. cout<<"the word day(first) is at index "<<loc<<endl;
  13. loc=s.find_first_not_of("study");
  14. cout<<"the first word not of study is at index"<<loc<<endl;
  15. loc=s.find_last_of("day");
  16. cout<<"the last word of day is at index"<<loc<<endl;
  17. loc=s.find("day");//缺陷状态下从第一个往后找
  18. cout<<loc;
  19. return 0;
  20. }

运行结果:

五、其他常用函数

  1. string &insert(int p,const string &s); //在p位置插入字符串s
  1. string &replace(int p, int n,const char *s); //删除从p开始的n个字符,然后在p处插入串s
  1. string &erase(int p, int n); //删除p开始的n个字符,返回修改后的字符串
  1. string substr(int pos = ,int n = npos) const; //返回pos开始的n个字符组成的字符串
  1. void swap(string &s2); //交换当前字符串与s2的值
  1. string &append(const char *s); //把字符串s连接到当前字符串结尾
  1. void push_back(char c) //当前字符串尾部加一个字符c
  1. const char *data()const; //返回一个非null终止的c字符数组,data():与c_str()类似,用于string转const char*其中它返回的数组是不以空字符终止,
  1. const char *c_str()const; //返回一个以null终止的c字符串,即c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,用于string转const char*

测试代码:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string str1 = "abc123defg";
  7. string str2 = "swap!";
  8. cout<<str1<<endl;
  9. cout<<str1.erase(3,3)<<endl; //从索引3开始的3个字符,即删除掉了"123"
  10. cout<<str1.insert(0,"123")<<endl; //在头部插入
  11. cout<<str1.append("123")<<endl; //append()方法可以添加字符串
  12. str1.push_back('A'); //push_back()方法只能添加一个字符
  13. cout<<str1<<endl;
  14. cout<<str1.replace(0,3,"hello")<<endl; //即将索引0开始的3个字符替换成"hello"
  15. cout<<str1.substr(5,7)<<endl; //从索引5开始7个字节
  16. str1.swap(str2);
  17. cout<<str1<<endl;
  18. const char* p = str.c_str();
  19. printf("%s\n",p);
  20. return 0;
  21. }

程序执行结果为:

abc123defg

abcdefg

123abcdefg

123abcdefg123

123abcdefg123A

helloabcdefg123A

abcdefg

swap!

swap!

C++string类总结的更多相关文章

  1. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  2. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  3. C++ string类的实现

    c++中string类的实现 今天面试被考到了, 全给忘记了!!!   //string类的实现 #include <iostream> #include <string.h> ...

  4. String类的功能

    String类              标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...

  5. java基础复习:final,static,以及String类

    2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...

  6. String类和StringBuffer类的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  7. 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明

    Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...

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

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  9. String类常用方法

    1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...

  10. 运用String类实现一个模拟用户登录程序

    package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...

随机推荐

  1. SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.

    用了一段时间SpringBoot,之前配置MYBATIS ,在打包WAR 放到tomcat下正常,但是WAR已经过时了,现在流行直接打包JAR 丢到DOCKER 里,无奈JAR 启动的时候MAPPER ...

  2. webpack代码分离 ensure 看了还不懂,你打我(转)

    webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...

  3. 深度学习word2vec笔记之基础篇

    作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...

  4. Error Code: 1360 - Trigger does not existQuery

    1.错误描述 Query: DROP TRIGGER `t_sert_cs_approve` Error occured at:2015-04-12 13:37:32 Line no.:1 Error ...

  5. ArgumentError: Error #1063: BasicChart/dataFunc() 的参数数量不匹配。应该有 2 个,当前为 3 个。

    1.错误描述 ArgumentError: Error #1063: BasicChart/dataFunc() 的参数数量不匹配.应该有 2 个,当前为 3 个. at mx.charts.char ...

  6. 求助:关于sql如何统计时间的问题

    三.现在我们假设应用计时分为app应用和web应用,需要考虑如下几个方面: (1)多时间段(2)表中有冗杂数据 (3)用户是在web端和app端都登陆,这种类型的重复时间段只能取其一 存在数据: 存在 ...

  7. 简述“类(class)”,“类库(class library)”,“包(package)”,“jar文件”这四个概念间的关系

    (1)类(class)实际上是对某种类型的对象定义变量和方法的原型,它表示对现实生活中的一类具有共同特征的事物的抽象. (2)为了更好地组织类,java提供了包机制.包(package)是类的容器,用 ...

  8. 【BZOJ2882】工艺(后缀自动机)

    [BZOJ2882]工艺(后缀自动机) 题面 BZOJ权限题,良心洛谷 题解 还是一样的,先把串在后面接一遍 然后构建\(SAM\) 直接按照字典序输出\(n\)次就行了 #include<io ...

  9. [Luogu2852][USACO06DEC]牛奶模式Milk Patterns

    Luogu 一句话题意 给出一个串,求至少出现了\(K\)次的子串的最长长度. sol 对这个串求后缀数组. 二分最长长度. 如果有\(K\)个不同后缀他们两两的\(lcp\)都\(>=mid\ ...

  10. 【BZOJ1857】传送带(三分)

    [BZOJ1857]传送带(三分) 题面 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P, ...