C++中的字符串类
1,本文分析 C++ 中的字符串,C 语言中的字符串利用的是 C 语言中的字符数组, 在 C 语言中没有真正意义上的字符串,利用了字符数组表示了字符串,最初设 计 C 语言仅仅是为了开发 Unix 操作系统,而开发操作系统要处理的仅仅是数 据本身,关于字符串的处理很少,所以说当时没有在 C 语言中内置一个字符串 现在绝大多数都是在用 C 语言开发应用程序,而开发应用程序中对字符串的处 理是非常多的,如果还是用字符数组表达字符串,一定会使得开发效率大大下 降,因此在 C++ 中有必要引入字符串的概念,不仅仅是用字符数组来模拟,而 是真正意义上的字符串;
2,历史遗留问题:
1,C 语言不支持真正意义上的字符串;
1,C++ 也不支持;
2,C 语言用字符数组和一组函数实现字符串操作;
1,C++ 同样支持;
3,C 语言不支持自定义类型,因此无法获得字符串类型;
1,C++ 支持自定义类型,因此可以获得字符串类型;
3,解决方案:
1,从 C 到 C++ 的进化过程引入了自定义类型;
2,在 C++ 中可以通过类完成字符串类型的定义;
4,C++ 中的原生类型系统是否包含字符串类型?
1,不包含;
5,标准库中的字符串类:
1,C++ 语言直接支持 C 语言的所有概念;
2,C++ 语言中没有原生的字符串类型;
3,C++ 标准库提供了 string 类型:
1,string 直接支持字符串连接;
1,重载 “+”;
2,string 直接支持字符串的大小比较;
1,重载大小操作符,可以对字符串进行排序;
3,string 直接支持子串查找和提取;
4,string 直接支持字符串的插入和替换;
5,查阅 C++ 标准库文档;
6,字符串类的使用编程实验:
1,main.cpp 文件:
#include <iostream>
#include <string> using namespace std; void string_sort(string a[], int len)
{
for(int i=; i<len; i++)
{
for(int j=i; 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] + "; "; // string 类重载了 “+=” 和 “+”;
} return ret;
} int main()
{
string sa[] =
{
"Hello World",
"D.T.Software",
"C#",
"Java",
"C++",
"Python",
"TypeScript"
}; string_sort(sa, ); for(int i=; i<; i++)
{
cout << sa[i] << endl;
} cout << endl; cout << string_add(sa, ) << endl; return ;
}
2,输出结果:
C#
C++
D.T.Software
Hello World
Java
Python
TypeScript C#; C++; D.T.Software; Hello World; Java; Python; TypeScript;
3,C++ 中没有必要使用字符数组模拟字符串了,直接使用标准库中的 string 类型;
7,标准库中的字符串类:
1,字符串与数字的转换:
1,标准库中提供了相关的类对字符串和数字进行转换;
1,基于字符串流类 sstream 来进行转换;
2,sstream 类诞生的目的就是为了支持字符串和数字之间的相互转换;
2,字符串流类(sstream)用于 string 的转换:
1,<sstream> - 相关头文件;
2,istringstream - 字符串输入流;
3,ostringstream - 字符串输出流;
2,使用方法:
1,string ==> 数字;
1,istringstream iss("123.45");
2,double num;
3,iss >> num;
1,传输成功,表达式值为 true,失败则为 false;
4,上述三步,等价于 istringstream("123.45") >> num;
2,数字 ==> string:
1,ostringstream oss;
2,oss << 543.21;
1,返回值是 oss 本身;
3,string s = oss.str();
4,上述三步,等价于 s =(sotringstream() << 543.21).str();
3,输入输出是相对内存而言的;
8,字符串和数字的转换编程实验:
1,main.cpp 文件:
#include <iostream>
#include <sstream>
#include <string> using namespace std; /* 实际工程用法,目前为止(后续采用模板),只能通过 C 语言中的宏来只写一遍代码处理所有的因类型不同而要完成的函数重载 */
#define TO_NUMBER(s, n) (istringstream(s) >> n) // 宏要在一行代码中完成,直接调用构造函数产生临时对象,临时对象声明周期可以满足要求;这里定义了临时对象,并将临时对象传递到 n 中去;
#define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str()) // 调用构造函数生成临时对象,这里 (ostringstream&) 为强制类型转换否则编译器显示 error: ‘struct std::basic_ostream<char, std::char_traits<char> >’ has no member named ‘str’这个错误; int main()
{
double n = ; if( TO_NUMBER("234.567", n) ) // 返回 bool 类型的变量;
{
cout << n << endl;
} string s = TO_STRING(); cout << s << endl; return ;
}
9,面试题分析:
1,示例:abcdefg 循环右移 3 位后得到 efgabcd;
10,用 C++ 完成面试题编程实验:
1,main.cpp 文件:
#include <iostream>
#include <string> using namespace std; /* 将 string rignt_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;
} int main()
{
string s = "abcdefg";
string r = (s >> ); cout << r << endl; return ;
}
2,输出结果:
efgabcd
3,整个过程没有出现字符数组,我们站在了更高的角度处理问题,并且函数内部实现也非常简单,没有 for 循环;
4,面试时,对于一个面试题,面试官一般不需要最后的答案,需要的是你如何思考,如何解决的,考察是思维能力和解决问题能力;
11,小结:
1,应用开发中大多数的情况都在进行字符串处理;
2,C++ 中没有直接支持原生的字符串类型;
3,标准库中通过 string 类支持字符串的概念;
4,string 类支持字符串和数字的相互转换;
5,string 类的应用使得问题的求解变得简单;
C++中的字符串类的更多相关文章
- 第33课 C++中的字符串类
在C语言中学习字符串时,我们使用的是字符数组的概念. C语言中没有真正意义的字符串.为了表达字符串的概念,我们使用了字符数组来模拟字符串. 在应用程序开发中,我们需要大量的处理字符串,如果还用C语言中 ...
- 第11课 Qt中的字符串类
1. 历史遗留问题和解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串 ②C语言用字符数组和一组函数实现字符串操作 ③C语言不支持自定义类型,因此无法获得字符串类型 (2)解决方案 ①从C ...
- Qt学习之路(2)------Qt中的字符串类
QString QString的一些基本用法 basic.cpp #include <QTextStream> int main(void) { QTextStream out(stdou ...
- Qt 中QString 字符串操作:连接、组合、替换、去掉空白字符
Qt中的字符串类 QString类 保存了16位Unicode值,提供了丰富的操作.查询和转换等函数. QString 字符串有如下几个操作符: (1) "+" 用于组合两个字符串 ...
- C++解析(18):C++标准库与字符串类
0.目录 1.C++标准库 2.字符串类 3.数组操作符的重载 4.小结 1.C++标准库 有趣的重载--操作符 << 的原生意义是按位左移,例:1 << 2;,其意义是将整数 ...
- 第 33课 C++中的字符串(上)
历史的遗留问题在C语言中没有真正意义上的字符串,为了表达字符串这个概念利用字符数组来模拟字符串.C语言不支持真正意义上的字符串 (C++也不支持)C语言用字符数组和一组函数实现字符串操作 (C++中同 ...
- C++ 标准库字符串类使用
标准库中的字符串类 C++语言直接支持C语言所有概念. C++中没有原生的字符串类型. 由于C++中没有原生的字符串类型,C++标准库提供了string类型. 1.string 直接支持字符串链接 2 ...
- 第33课 C++中的字符串
1. 历史遗留问题及解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串------c语言是用字符数组实现字符串 ②C语言用字符数组和一组函数模拟字符串操作 ③C语言不支持自定义类型,因此无 ...
- Java中各种集合(字符串类)的线程安全性!!!
Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...
随机推荐
- 对js库的调研研究------引用
1. 引言 从以下几个方面来阐述这个问题: 特性. 稳定性. 性能. 包生态. 社区. 学习曲线. 文档. 工具. 发展历史. 团队. 兼容性. 趋势. 2.概述 & 精读 特性 当你调研一个 ...
- Winserver-禁止程序启动
注册表限制程序启动 经测试,可以阻止手动启动,但在job中还是会有启动的进程,这个待确定. run→regedit 添加程序只写exe名就行 手动不能运行了
- 019:re_path函数详解
re_path使用: 1.re_path和path的作用是一样的,只不过re_path在写url的时候可以使用正则表达式——功能更加强大: 2.使用正则表达式时,推荐使用原生字符串(即:已 r 开头的 ...
- 参数上使用自定义注解在aop中无法获取到该参数
https://ask.csdn.net/questions/769477 /** * 环绕增强,验证权限 * @param joinPoint 目标对象 * @param authCheck 自定义 ...
- html applet标签 语法
html applet标签 语法 作用:定义嵌入的 applet. 说明:某些浏览器中依然存在对 <applet> 但是需要额外的插件和安装过程才能起作用.大理石机械构件 注释:HTML5 ...
- python实现的ocr接口
太累了,,有时间再补解释 import pytesseract import requests from PIL import Image from PIL import ImageFilter fr ...
- [C++基础] 纯虚函数
整理摘自https://blog.csdn.net/ithomer/article/details/6031329 1. 申明格式 class CShape { public: ; }; 在普通的虚函 ...
- css命名和书写规范
前言 在项目开发中对于css名字的命名和书写老是感觉很混乱,这对于代码的可读性以及维护提出了挑战,所以在闲暇之余看了一些这方面的内容,现总结如下... 1.命名规则说明 所有的命名最好都小写 属性的值 ...
- SQL server 从创建数据库到查询数据的简单操作
目录. 创建数据库 创建表 插入数据 查询 1.创建数据库 --创建数据库 create database db_Product go --使用数据库use db_Productgo 2.创建表 -- ...
- vue simple框架打包遇到报错问题
问题描述:之前一个项目使用vue-simple框架 打包时老是报错 :原因是es6转化es5时候有错误: 解决: alias: { 'vue$': 'vue/dist/vue.esm.js', // ...