VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 527|回复: 28

《实用C++》第51课 C++中的字符串类stirng①

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-6-29 00:15:21 | 显示全部楼层 |阅读模式
1、string概述:
之前给大家讲解过字符数组 char szbuf[] = "hello world."; 可以表示字符串,也可以使用指针 char* p = "hello world."; 但是这些操作方式对于非常基本的字符串表示可能够了,但是针对我们平时编程过程中遇到的各种各样的字符串操作就显得捉襟见肘,不太够用了。比如,字符串的连接,比较,拷贝等等,都得借助其他函数,strcat,strcmp,strcpy 等等,而且还要判断目标的字符数组空间大小是否够用,不够用了还得重新申请等等。那么有没有现成的封装好的字符串类呢?C++都都提供了 vector、list、queue、map 等各种各样的容器,难道就没有一个字符串的类吗?答案当然是有的,那就是 string。string 是C++ STL 标准模板库提供的,所以其与C++中的各种输入输出,各种容器等都是兼容适配的,使用起来也非常方便。

2、string的头文件和命名空间:
#include <string> //注意,没有 .h
using namespace std; //在 std 标准命名空间中

3、string对象的定义:
string str(const char *s);    //用C语言中的字符串 s 初始化 string 对象
string str(int n, char c);     //用 n个字符c初始化 string对象 str
此外,string类还支持默认构造函数和拷贝构造函数,例如:
string s1;
string s2 = "hello";
以上都是正确的写法。怎么样很方便吧?

4、string字符串的字符相关操作:
可以使用 at 方法或者 [ ]操作符来访问string对象中的某个位置的字符,例如:
string str = "abcdefg";
char ch1 = str.at(0);
char ch2 = str[1];
另外,刚才给大家说了,可以使用一个 char * 字符串来初始化 string 对象,那么反过来呢,能不能从一个 string 对象得到 char * 的指针?因为有的函数需要用 char * 而不是 string,下面教大家来操作下:
char* pstr = str.c_str();

5、string字符串的基本信息:
string 的 size() 方法返回字符串的长度,empty() 方法返回字符串是否为空。同时 string 支持输入与输出流操作:
string str = "123";
int n_size = str.size();
bool is_empty = str.empty();
cout << str << endl;
cin >> str;
cout << str << endl;

6、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 迭代器之间的部分赋给字符串

平时常用的就是 = 号操作符,当然 assign 函数更灵活一些,所以大家可以选择性的使用。
备注:相关代码演示详见视频教程!

7、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的赋值操作都理解了的话,那么这个连接的操作跟赋值没什么太大的区别,就是把 = 换成 +=,把 assign 换成 append,对吧?
备注:相关代码演示详见视频教程!

8、string字符串的比较:
bool operator==(const string &s1, const string &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;    //跟C类型的字符串 s 做比较
int compare(int pos, int n, const char *s) const;    //比较当前字符串从pos开始的n个字符组成的字符串与C类型的字符串 s 的大小
int compare(int pos, int n, const char *s, int pos2) const;    //比较当前字符串从pos开始的n个字符组成的字符串与C风格字符串 s 中pos2开始的n2个字符组成的字符串的大小
compare 函数在 > 时返回1,< 时返回 -1,== 时返回 0

当然,一般情况下载比较字符串的时候直接使用 ==、>、>=、<、<=、!= 等操作符的几率会高一些,不过 compare 更细致更灵活一些。
备注:相关代码演示详见视频教程!

第51课免费试看,下载地址回复后可见:
游客,如果您要查看本帖隐藏内容请回复

#######################################################
获得所有教学视频、课件、源代码以及售后答疑详见:
《实用C++》:http://www.cctry.com/thread-275996-1-1.html
VC驿站官方客服QQ:8260671

#######################################################




上一篇:第十课小作业这样行吗?
下一篇:《实用C++》第52课 C++中的字符串类stirng②

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

74_avatar_middle
online_member jiaokai123 发表于 2018-6-29 00:40:31 | 显示全部楼层
《实用C++》第51课 C++中的字符串类stirng①

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
online_member zp521 发表于 2018-6-29 08:47:09 | 显示全部楼层
坚持学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
online_member tomok 发表于 2018-6-29 08:53:01 | 显示全部楼层
谢谢提供 继续

学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
online_vip08 wssfcn 发表于 2018-6-29 09:54:18 | 显示全部楼层
看看        

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

78_avatar_middle
online_member csa 发表于 2018-6-29 12:09:29 | 显示全部楼层
更新好快,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

66_avatar_middle
online_member ly1599285982 发表于 2018-6-29 15:25:53 | 显示全部楼层
1、string概述: 之前给大家讲解过字符数组 char szbuf[] = "hello world."; 可以表示字符串,也可以使用指针 char* p = "hello world."; 但是这些操作方式对于非常基本的字符串表示可能够了,但是针对我们平时编程过程中遇到的各种各样的字符串操作就显得捉襟见肘,不太够用了。比如,字符串的连接,比较,拷贝等等,都得借助其他函数,strcat,strcmp,strcpy 等等,而且还要判断目标的字符数组空间大小是否够用,不够用了还得重新申请等等。那么有没有现成的封装好的字符串类呢?C++都都提供了 vector、list、queue、map 等各种各样的容器,难道就没有一个字符串的类吗?答案当然是有的,那就是 string。string 是C++ STL 标准模板库提供的,所以其与C++中的各种输入输出,各种容器等都是兼容适配的,使用起来也非常方便。  2、string的头文件和命名空间: #include <string> //注意,没有 .h using namespace std; //在 std 标准命名空间中  3、string对象的定义: string str(const char *s);    //用C语言中的字符串 s 初始化 string 对象 string str(int n, char c);     //用 n个字符c初始化 string对象 str 此外,string类还支持默认构造函数和拷贝构造函数,例如: string s1; string s2 = "hello"; 以上都是正确的写法。怎么样很方便吧?  4、string字符串的字符相关操作: 可以使用 at 方法或者 [ ]操作符来访问string对象中的某个位置的字符,例如: string str = "abcdefg"; char ch1 = str.at(0); char ch2 = str[1]; 另外,刚才给大家说了,可以使用一个 char * 字符串来初始化 string 对象,那么反过来呢,能不能从一个 string 对象得到 char * 的指针?因为有的函数需要用 char * 而不是 string,下面教大家来操作下: char* pstr = str.c_str();  5、string字符串的基本信息: string 的 size() 方法返回字符串的长度,empty() 方法返回字符串是否为空。同时 string 支持输入与输出流操作: string str = "123"; int n_size = str.size(); bool is_empty = str.empty(); cout << str << endl; cin >> str; cout << str << endl;  6、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 迭代器之间的部分赋给字符串  平时常用的就是 = 号操作符,当然 assign 函数更灵活一些,所以大家可以选择性的使用。 备注:相关代码演示详见视频教程!  7、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的赋值操作都理解了的话,那么这个连接的操作跟赋值没什么太大的区别,就是把 = 换成 +=,把 assign 换成 append,对吧? 备注:相关代码演示详见视频教程!  8、string字符串的比较: bool operator==(const string &s1, const string &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;    //跟C类型的字符串 s 做比较 int compare(int pos, int n, const char *s) const;    //比较当前字符串从pos开始的n个字符组成的字符串与C类型的字符串 s 的大小 int compare(int pos, int n, const char *s, int pos2) const;    //比较当前字符串从pos开始的n个字符组成的字符串与C风格字符串 s 中pos2开始的n2个字符组成的字符串的大小 compare 函数在 > 时返回1,< 时返回 -1,== 时返回 0  当然,一般情况下载比较字符串的时候直接使用 ==、>、>=、<、<=、!= 等操作符的几率会高一些,不过 compare 更细致更灵活一些。 备注:相关代码演示详见视频教程!  第51课免费试看,下载地址回复后可见

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
online_member ha521ha 发表于 2018-6-29 17:33:49 | 显示全部楼层

坚持学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

95_avatar_middle
online_member zjh2008 发表于 2018-6-29 20:19:43 | 显示全部楼层
坚持学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

48_avatar_middle
online_member haohongtao11 发表于 2018-6-30 11:53:29 | 显示全部楼层
dddddddddddddddddd

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

75_avatar_middle
online_member Sam599 发表于 2018-6-30 12:06:16 | 显示全部楼层
谢谢分享,楼主辛苦了!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

23_avatar_middle
online_vip 黑鱼 发表于 2018-6-30 14:34:56 | 显示全部楼层

坚持学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

96_avatar_middle
online_member Jer808 发表于 2018-6-30 16:53:10 | 显示全部楼层
学习学习,谢谢老大

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

85_avatar_middle
online_member 99099800 发表于 2018-6-30 16:54:18 | 显示全部楼层
感谢分享,学习一下.

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

86_avatar_middle
online_member wilbur 发表于 2018-7-2 14:51:58 | 显示全部楼层
好好学习好好学习好好学习好好学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

30_avatar_middle
online_member 13321788988 发表于 2018-7-2 17:33:48 | 显示全部楼层
rgehherehhre54h54rh

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

34_avatar_middle
online_member Sinyon 发表于 2018-7-2 22:22:25 | 显示全部楼层
不错不错,更新很快

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

40_avatar_middle
online_vip tychike 发表于 2018-7-4 19:58:10 | 显示全部楼层
认真学习!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

51_avatar_middle
online_member 954624 发表于 2018-7-5 06:25:11 | 显示全部楼层
之前给大家讲解过字符数组 char szbuf[] = "hello world."; 可以表示字符串,也可以使用指针 char* p = "hello world."; 但是这些操作方式对于非常基本的字符串表示可能够了,但是针对我们平时编程过程中遇到的各种各样的字符串操作就显得捉襟见肘,不太够用了。比如,字符串的连接,比较,拷贝等等,都得借助其他函数,strcat,strcmp,strcpy 等等,而且还要判断目标的字符数组空间大小是否够用,不够用了还得重新申请等等。那么有没有现成的封装好的字符串类呢?C++都都提供了 vector、list、queue、map 等各种各样的容器,难道就没有一个字符串的类吗?答案当然是有的,那就是 string。string 是C++ STL 标准模板库提供的,所以其与C++中的各种输入输出,各种容器等都是兼容适配的,使用起来也非常方便。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

24_avatar_middle
online_vip harecn 发表于 2018-7-6 22:21:46 | 显示全部楼层
继续学习。。。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-7-17 06:03

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表