第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 ...
随机推荐
- SpringMVC和Spring
SpringMVC和Spring汇总 转载:https://www.cnblogs.com/doudouxiaoye/p/5693399.html 1. 为什么使用Spring ? 1). 方便解耦, ...
- js页面跳转的问题(跳转到父页面、最外层页面、本页面)
"window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...
- 全网最深分析SpringBoot MVC自动配置失效的原因
前言 本来没有计划这一篇文章的,只是在看完SpringBoot核心原理后,突然想到之前开发中遇到的MVC自动失效的问题,虽然网上有很多文章以及官方文档都说明了原因,但还是想亲自看一看,本以为很简单的事 ...
- 洛谷 P4047 [JSOI2010]部落划分
这道题其实就是无线通讯网的双倍经验啦,只是在输出的时候不同罢了.还是一样的\(kruskal\)算法,但是在求的时候,应该在\(now=n-k+1\)的时候结束.本来到\(n-k\)就行了的,但是由于 ...
- 再探JVM内存模型
以前学JVM的时候看过<深入理解JVM>,当时看的很模糊也记了些笔记,更像是为了应付面试.事实是确实把笔记都背上了,春招找实习的时候,内存管理.类加载.垃圾回收三连背一遍.后来自己做项目的 ...
- HDU 3911 Black and White (线段树,区间翻转)
[题目地址] vjudge HDU [题目大意] 海滩上有一堆石头. 石头的颜色是白色或黑色. 小肥羊拥有魔术刷,她可以改变连续石的颜色,从黑变白,从白变黑. 小肥羊非常喜欢黑色,因此她想知道范围 ...
- GitHub 热点速览 Vol.27:程序员的自我救赎——GitHub 摸鱼
作者:HelloGitHub-小鱼干 摘要:都知道 VSCode 有各种摸鱼小插件,边听云音乐.边在 IDE 斗地主,再来一个 NBA 直播,怎一个美滋滋了得.作为 VSCode 的同门,GitHub ...
- jvm之栈、堆
1. Java Virtual Machine 人群当中,一位叫java的小伙子正向周围一众人群细数着自己取得的荣耀与辉煌.就在此时,c老头和c++老头缓步走来,看着被众人围住的java,c老头感 ...
- JavaScript学习 Ⅶ
十四. DOM(文档对象模型) 节点:Node--构成HTML文档最基本的单元 文档节点:整个HTML文档 元素节点:HTMl文档中的HTML标签 属性节点:元素的属性 文本节点:HTML标签中的文本 ...
- JVM 专题十五:执行引擎
1. 执行引擎概述 1.1 执行引擎 1.2 概述 执行引擎是Java虚拟机的核心组成部分之一. 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处 ...