第33课 C++中的字符串
1. 历史遗留问题及解决方案
(1)历史遗留问题
①C语言不支持真正意义上的字符串------c语言是用字符数组实现字符串
②C语言用字符数组和一组函数模拟字符串操作
③C语言不支持自定义类型,因此无法获得字符串类型
(2)解决方案
①从C到C++的进化过程引入了自定义类型
②在C++中可以通过类完成字符串类型的定义
问题:c++中的原生类型系统是否包含字符串类型??? ----------标准库实现
2. 标准库中的字符串类
(1)C++直接支持C语言的所有概念
(2)C++语言中没有原来的字符串类型
(3)C++标准库提供了string类型(支持字符串的连接、大小比较、子串查找和提取、字符串的插入和替换等操作)
//字符串排序和连接-----比c语言字符指针实现更简单
#include<iostream> //字符串类的使用,使用标准库 避免c中的字符数组,提高开发效率
#include<string> using namespace std; void string_sort(string a[], int len) //字符串排序 //排序算法(选择排序两个For循环)
{
for (int i = ; i < len; i++)
{
for (int j = ; j < len; j++)
{
if (a[i] > a[j]) //字符串类string的大小比较,标准库重载了大于小于的操作符
{
swap(a[i], a[j]);
}
}
}
} string string_add(string a[], int len) //将参数字符串列表的字符串 连接
{
string ret = " "; for (int i = ; i < len; i++)
{
ret += a[i] + ";"; //标准库有操作符重载+
} return ret;
} int main()
{
string sa[] =
{
"helloworld",
"D.T.Software",
"C#",
"Java",
"Python",
"TypeScript"
}; string_sort(sa, ); //基于字典顺序排序 for (int i = ; i < ; i++)
{
cout << sa[i] << endl;
} cout << string_add(sa,) << endl; return ;
}
3. 标准库中的字符串类
(1)字符串流类:(<sstream>头文件)
标准库中提供了相关的类对字符串和数字进行转换
字符串流类(sstream)用于string的转换
istringstream:字符串输入流--------i
ostringstream:字符串输出流-------o
(2)字符串与数字的转换
string→数字 |
数字→string |
istringstream iss("123.45");字符串放入流对象 double num; 变量num接收转化后的值 iss>>num; |
ostringstream oss; 定义流对象 oss<<543.21; 数字传到流对象 string s = oss.str(); |
#include<iostream>
#include<sstream>
#include<string> //字符串流类sstream完成对字符串和数字的交换 属于类要创建对象使用
//istringstream 字符串输入流
//ostringstream字符串输出流 using namespace std; int main()
{ istringstream iss("123.45"); //字符串转数字
double num; if (iss >> num) // >>右操作数返回值为bool类型
{
cout << num << endl; //123.45
} ostringstream oss; //数字转字符串
oss << 543.21;
oss << << "." << ; // <<左操作数返回值为oss本身 string s = oss.str(); cout << s << endl; //543.21 return ;
}
#include<iostream>
#include<sstream>
#include<string> //实际工程做法,定义全局函数to_number using namespace std; //整形
bool to_number(const string& s, int& n) //Int型 字符串s转 Int型 n:转换结果
{
istringstream iss(s);
return iss >> n;
}
//浮点型
bool to_number(const string& s, double& n) //Int型 字符串s转 Int型 n
{
istringstream iss(s);
return iss >> n;
} //string to_string(int n)
{
ostringstream oss;
oss << s;
resturn oss.str();
}
string to_string(double n)
{
ostringstream oss;
oss << s;
resturn oss.str();
} //float 型 ?????函数体一致,复制粘贴不太好,能不能用一个函数完成不同数字类型,使用宏 int main()
{
int n = ;
cout << to_number("", n) << endl;
cout << n << endl; istringstream iss("123.45"); //字符串转数字
double num;
if (iss >> num) //返回值为bool类型
{
cout << num << endl; //123.45
} ostringstream oss; //数字转字符串
oss << 543.21; //oss<<543<<"."<<21; //返回值为左操作数oss对象本身
string s = oss.str(); cout << s << endl; //543.21 return ;
}
函数体一致,复制粘贴不太好,能不能用一个函数完成不同数字类型,使用宏
#include<iostream>
#include<sstream>
#include<string> //能不能用一个函数完成不同数字类型,,使用宏 using namespace std; #define TO_NUMBER(s,n) (istringstream(s)>>n) //调用构造函数,产生一个字符串输入流临时对象,宏要在一行代码里完成,临时对象周期满足要求
//#define TO_STRING(n)( (ostringstream()<<n).str() ) //字符串输出流临时对象
#define TO_STRING(n) (((ostringstream&)(ostringstream()<<n)).str()) /*string to_string(int n)
{
ostringstream oss;
oss << s;
resturn oss.str();
//return (ostringstream&(ostringstream() << n)).str();
}*/ int main()
{
int n = ; //double n=0; if (TO_NUMBER("", n))
{
cout << n << endl;
} string s = TO_STRING(); cout << s << endl; return ;
}
(3)string类的相关操作
①注意事项:
A. #include <string>。注意,不是<string.h>。
B. 分为string和wstring版。分别对应char和wchar_t
C. using std::string;或using std::wstring;
②string类的相关操作(https://www.cnblogs.com/5iedu/p/5413930.html)
面试题:字符串循环右移
#include<iostream>
#include<string> //面试题:完成字符串循环右移3位 abcdefg -->>>efgabcd 使用标准库字符串类
//使用string类成员函数 using namespace std; //string right_func(const string& s, unsigned int n) string operator >> (const string& s, unsigned int n) //操作符重载右移操作符
{
string ret = "";
unsigned int pos = ; // 找子串右移开始的位置; n = n % s.length(); //防止右移位置很大的情况,让其合法;
pos = s.length() - n; //得到最终想要的位置; ret = s.substr(pos); // 从 pos 开始直到末尾提取子串;
ret += s.substr(, pos); //原来的字符串并没有被破坏,提取到 pos 之前的字符; return ret; //abcdefg =====>8
//abcd efg======>1
//8%7========>1 //7-1=======>6
//abcded g
//ret==>g
//ret===>g+abcdef } int main()
{
// string r = right_func("abcdefg", 8); //函数方式还不太好,可以使用操作符重载 string s = "abcdefg";
string r = (s>>); cout << r << endl; return ; } c语言实现 #include <stdio.h>
#include <string.h>
void right_shift(char* str, char* result, unsigned int n)
{
int len = strlen(str);
for (int i = ; i < len; i++)
{
result[(i + n) % len] = str[i];
}
result[len] = '\0';
} int main()
{
char* str = "abcdefg";
char result[] = { };
right_shift(str, result, );
printf("%s\n", result); return ;
}
面试题:使用 string 类完成--------字符串反转
示例:"we;tonight;you" -- > "ew;thginot;uoy
提示: string 类中提供了成员函数可以查找目标字符的位置
#include<iostream>
#include<string> //要求:使用 string 类完成
//示例:"we;tonight;you" -- > "ew;thginot;uoy
//提示: string 类中提供了成员函数可以查找目标字符的位置 using namespace std; string reverse(const string& s, const char c)
{
string ret = "";
string substr = ""; int pos = s.find(c); if (pos != -)
{
substr = s.substr(, pos);
}
else
{
substr = s.substr();
} for (int i = ; i < substr.length() + ; i++)
{
ret += substr[substr.length() - i];
} if (pos != -)
{
ret += c;
ret += reverse(s.substr(pos + ), c);
} return ret; } int main()
{
cout << reverse("", ';') << endl; // 输出:空字符串
cout << reverse(";", ';') << endl; // 输出:;
cout << reverse("abcde;", ';') << endl; // 输出:edcba;
cout << reverse("we;tonight;you", ';') << endl; // 输出:ew;thginot;uoy return ;
}
4. 小结
(1)应用开发中大多数的情况都在进行字符串处理
(2)C++中没有直接支持原生的字符串类型
(3)标准库中通过string类支持字符串的概念
(4)string类支持字符串和数字的相互转换
(5)string类的应用使得问题的求解变得简单
第33课 C++中的字符串的更多相关文章
- 第33课 C++中的字符串类
在C语言中学习字符串时,我们使用的是字符数组的概念. C语言中没有真正意义的字符串.为了表达字符串的概念,我们使用了字符数组来模拟字符串. 在应用程序开发中,我们需要大量的处理字符串,如果还用C语言中 ...
- 第 33课 C++中的字符串(上)
历史的遗留问题在C语言中没有真正意义上的字符串,为了表达字符串这个概念利用字符数组来模拟字符串.C语言不支持真正意义上的字符串 (C++也不支持)C语言用字符数组和一组函数实现字符串操作 (C++中同 ...
- 第 33课 C++中的字符串(下)
字符串与数字转换-标准库中提供了相关的类对字符串和数字进行转换-字符串流类(sstream)用于string的转换.<sstream>-相关头文件.istringstream-字符串输入流 ...
- 第11课 Qt中的字符串类
1. 历史遗留问题和解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串 ②C语言用字符数组和一组函数实现字符串操作 ③C语言不支持自定义类型,因此无法获得字符串类型 (2)解决方案 ①从C ...
- SQL点滴33—SQL中的字符串操作
原文:SQL点滴33-SQL中的字符串操作 计算字符串长度len()用来计算字符串的长度 select sname ,len(sname) from student 字符串转换为大.小写lower() ...
- [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
本課主題 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 [引言部份:你希望读者看完这篇博客 ...
- MySql、Oracle、MSSQL中的字符串的拼接
字符串的拼接 1,Mysql 在Java.C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"."a"+"b ...
- Springboot 之 自定义配置文件及读取配置文件注意:配置文件中的字符串不要有下划线 .配置中 key不能带下划线,value可以(下划线的坑,坑了我两天..特此纪念)
注意:配置文件中的字符串不要有下划线 .配置中 key不能带下划线,value可以 错误的.不能读取的例子: mySet .ABAP_AS_POOLED = ABAP_AS_WITH_P ...
- [转]mysql中的字符串的拼接
字符串的拼接 1,Mysql 在Java.C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"."a"+"b ...
随机推荐
- html里输入框和密码框的提示文字怎么弄
HTML5 新增属性,浏览器版本低于IE8应该不支持 placeholder 属性 placeholder 属性规定用以描述输入字段预期值的提示(样本值或有关格式的简短描述). 该提示会在用户输入值之 ...
- Redis系列(十):数据结构Set源码解析和SADD、SINTER、SDIFF、SUNION、SPOP命令
1.介绍 Hash是以K->V形式存储,而Set则是K存储,空间节省了很多 Redis中Set是String类型的无序集合:集合成员是唯一的. 这就意味着集合中不能出现重复的数据.可根据应用场景 ...
- CentOS 的命令链接符“;”
";" 用于在一行中输入多个命令,执行顺序=输入顺序. For instance: $ ls -a;cd Music
- 阿里云Linux CentOS8.1 用 xshell 上传和下载文件
下载: 例如有一个script 文件夹,我们要把它打包成 tar文件,并下载到本地.具体命令如下: 1.进入script 所在的目录,先打包,命令如下: tar -cvf script.tar scr ...
- 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之调试工具ab(apache bench)
ab 测试工具,全称是 apache bench ,是 Apache 提供的一款测试工具,具有简单易上手的特点,在测试 Web 服务时非常实用. ab 可以在 Windows 系统中使用,也可以在 L ...
- EOS基础全家桶(十四)智能合约进阶
简介 通过上一期的学习,大家应该能写一些简单的功能了,但是在实际生产中的功能需求往往要复杂很多,今天我就继续和大家分享下智能合约中的一些高级用法和功能. 使用docker编译 如果你需要使用不同版本的 ...
- css3 斜切角/斜边的实现方式来自BAT大神的出品
设计图含有斜切角的效果时,我们一般想到的方法是切出四个角为背景,然后用border连起来,这样就能显示出该效果了,那么直接使用css呢?下面就整理css做斜边的效果. 1.方案一:利用linear-g ...
- Java嵌套类,内部类和外部类
1.嵌套类,内部类 嵌套类是指被定义在一个类内部的类: JAVA的嵌套类有很多种类:1.静态成员类:2.非静态成员类:3.匿名类:4.局部类:其中,除了静态成员类之外,其他的都是内部类,因为静态成员类 ...
- windows jenkins下配置sonar-scanner
windows jenkins下配置sonar-scanner 一.基本配置信息 ① jenkins版本:2.222.4 ② sonarqube scanner版本:4.4.0.2170 ③ 操作系统 ...
- Redis哨兵集群创建脚本--v1
基础环境 操作系统版本 CentOS Linux release 7.6.1810 (Core) Docker 版本 19.03.11, build 42e35e61f3 Redis 版本 3 ...