第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 ...
随机推荐
- JDK8--02:为什么要使用lambda
lambda是一个匿名函数,我们可以把lambda理解为一个可以传递的代码(将代码像数据一样传递),可以写出更简洁更灵活的代码.首先看一下原来的匿名内部类实现方式(以比较器为例) //原来的匿名内部类 ...
- app自动化测试环境配置:adb环境配置、monkey环境配置、appium环境配置大全
1. 安装jdk 2. 安装配置Andriod sdk 安装Andriod sdk前首先需要安装配置好jdk环境. 然后安装Android sdk 安装完成后需要配置环境变量:ANDROID_HOME ...
- centos6.4 卸载 vim7.2 安装vim7.4
一.# rpm -qa|grep vim vim-minimal-7.2.-1.8.el6.x86_64 vim-enhanced-7.2.-1.8.el6.x86_64 vim-common-7.2 ...
- Oracle Online Patching报错"This is not a RAC setup. OPatch cannot determine the local node name"
Oracle Online Patching报错"This is not a RAC setup. OPatch cannot determine the local node name&q ...
- 每日一题 - 剑指 Offer 37. 序列化二叉树
题目信息 时间: 2019-06-29 题目链接:Leetcode tag:序列化 二叉树 队列 难易程度:中等 题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树. 示例: 1 / \ 2 ...
- .NET Core使用AngleSharp网络数据采集
环境: vs2019 .net core 3.1 angleSharp winform 安装:angleSharp 有这么一本Python的书: <<Python 网络数据采集>&g ...
- day28 作业
import uuid import pickle import os # 学校类 class School: #校区的名字:如"老男孩上海校区" #校区的地址:如"上海 ...
- Maven 专题(三):为什么要用Maven
1 真的需要吗? Maven 是干什么用的?这是很多同学在刚开始接触 Maven 时最大的问题.之所以会提出这个问题, 是因为即使不使用 Maven 我们仍然可以进行 B/S 结构项目的开发.从表述层 ...
- mongodb(四):对文档操作增删查改(python)
连接mongodb #!/usr/bin/env python # -*- coding:utf-8 -*- import pymongo mongo_client = pymongo.MongoCl ...
- Mysql数据库搭建集群---实现主从复制,读写分离
参考博客:https://blog.csdn.net/xlgen157387/article/details/51331244 A. 准备:多台服务器,且都可以互相随意访问root用户,都可以随意进 ...