萌新不看会后悔的C++string字符串常用知识点总结

举报
花狗Fdog 发表于 2021/04/19 22:33:02 2021/04/19
【摘要】 文章目录 一. 前言二. string字符串(正题)1. 字符串初始化,赋值,拼接,附加2. 字符串长度的函数3. string转换为char *4. 判断string对象是否为空5. int类型转string6. string类型转int7. 向string字符串插入字符8.对string字符串进行查找 一. 前言 前面学习字符串的时候简单...

在这里插入图片描述


一. 前言

前面学习字符串的时候简单说了string字符串和C风格字符串的不同,今天来详细的学习一下string字符串
过去学习C的时候,想要使用字符串应该是如下的格式:
char a[] = “hello world”; //这里省略了\0,但编译器会我们自动添加并隐藏
再高级一点:
char * b = “hello world”;
输入字符串:
scanf("%s", a);//很多C初学者常犯的一个错就是给a取地址,其实这里的a已经是地址了,无需使用&取地址符
输出字符串:
cout << a << endl;
cout << b << endl;
如果我们想让两个字符串相加:
strcat(a, a);
别问我为什么不使用strcat(a,b);因为程序会炸。
cout << a << endl;
或者是复制:
strcpy(a, a);
上面所说的是C风格的字符串,C++的标准库增加了string类,string字符串比C语言中的字符串更加方便,更加强大,更加安全。
既然是C的超集,怎么能没有点新东西来替代C呢,嘿嘿。


二. string字符串(正题)

1. 字符串初始化,赋值,拼接,附加

进入今天的正题,string类型被定义在string头文件。

 string str_1 = "hello world";  //拷贝初始化
 string str_2 = { "hello world" }; //拷贝初始化
 string str_3("hello world");  //直接初始化
 string str_4{ "hello world" };  //直接初始化
 //可以使用上面任意一种来初始化string对象,并且string字符串是不保存'\0'的,string对象有自己的成员函数
 //用来记录字符串大小,所以不变判断字符串结尾
 //赋值
 string str;
 char a[20] = { "abcde" };
 str = a; 
 cout << str << endl;
 char *b = { "eeee" };
 str = b;
 //拼接 附加
 cout << str << endl;
 str = str + a;
 cout << str << endl;
 str = str + b;
 cout << str << endl;
 
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

事实就是string更加方便,更加安全,更加强大,string兼容了C的字符串

运行结果:
在这里插入图片描述


2. 字符串长度的函数

//在C++新增string之前,想要拼接需要使用strcpy(),想要使用附加使用strcat()
 //当然,string对象也是可以使用上述函数,另外在C种操作字符串赋值时存在这样问题:
 char site[10] = { "abcdef" };
 char site_2[10] = { "aaaaa" };
 //strcat(site, site_2);
 //这样将发生错误,无法存储目标大小之外信息导致程序崩溃
 //C为了避免上述情况,提供了strncat()和strcpy()两个函数,函数多了一个参数,就是允许长度的最大值
 //求长度可以使用strlen();
 //新增的string类提供许多成员函数,用来简化繁琐的操作
 //字符串长度的函数:
 string str = "花狗";
 cout << str.size();
 cout << str.length();
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

size()和length()没有区别,都是返回字符串的字节数
在这里插入图片描述

运行结果:
在这里插入图片描述


3. string转换为char *

 const char * c = str.c_str();//返回以'\0'结尾的字符串
 const char * ca = str.data();//生产的字符串有没有'\0'不确定
 cout << c << endl;
 cout << ca << endl;
  
 
  • 1
  • 2
  • 3

c_str()函数会返回一个以’\0’结尾的字符串,而data()没有标准,查看两个函数定义:
在这里插入图片描述

return pointer to null-terminated nonmutable array 指明c_str会返回带有空字符结尾的字符串,但是data没有提及。


4. 判断string对象是否为空

string str;
if(str.empty())
{
//……
}
  
 
  • 1
  • 2
  • 3
  • 4

5. int类型转string

#include<sstream>
 int number = 123;
 stringstream s;
 s << number;
 string str_1 = s.str(); //第一种
 s >> str_1; //这种写法也可以
 cout << str_1;
 //第二种
 int number_2 = 123;
 string str_3;
 str_3 = to_string(number_2);
 cout << str_3;
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这里不单单指int类型,包括整形和浮点型,既然涉及到了stringstream,再说一个例子:

6. string类型转int

string str;
while(getline(cin,str))
{ int num; stringstream s(line); while(ss>>x) { cout<<x<<endl; }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

读者应该看出来了,这是字符串转整形,知识是需要学会灵活运用,学会了正向,也要思考逆向。


7. 向string字符串插入字符

 string str = "hello my name huagou ";
 string str_1 = "is "; 
 str.insert(14, str_1);
 cout << str;
 //insert有很多变体,如果有兴趣可自行查看
  
 
  • 1
  • 2
  • 3
  • 4

8.对string字符串进行查找

 string str = " y hello my name is zhangxv";
 string str_1 = "my";
 if (str.find(str_1)!=string::npos)//find其实还有一个参数为起始查找位置,默认为0,找到会返回下标
 {
  cout << "找到了";
 }
 //是不是C风格的字符串方便多了呢?字符和字符串都是可以查找的。
 //find函数的返回值是整数,假如字符串存在包含关系,其返回值必定不等于npos(一个常数) //num = s.find_first_of(str) 返回str出现在母串s中的首次出现的位置
 //num = s.find_last_of(str) 返回str出现在母串s中的最后一次出现的位置
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

不同点:
find(): 查找字符串中第一次出现字符c、字符串s的位置;
find_first_of(): 查找字符串中字符c、字符数组s中任意一个字符第一次出现的位置。

string字符串就写到这里喽。拜拜!


文章来源: blog.csdn.net,作者:花狗Fdog,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Fdog_/article/details/105327018

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。