1. 历史遗留问题及解决方案
(1)历史遗留问题
①C语言不支持真正意义上的字符串
②C语言用字符数组和一组函数实现字符串操作
③C语言不支持自定义类型,因此无法获得字符串类型
(2)解决方案
①从C到C++的进化过程引入了自定义类型
②在C++中可以通过类完成字符串类型的定义
2. 标准库中的字符串类
(1)C++直接支持C语言的所有概念
(2)C++语言中没有原来的字符串类型
(3)C++标准库提供了string类型(支持字符串的连接、大小比较、子串查找和提取、字符串的插入和替换等操作)
【编程实验】字符串类的使用 33-1.cpp
#include <iostream> #include <string> using namespace std; //选择排序 void string_sort(string a[], int len) { for(int i=0; i<len; i++) { for(int j = i; j < len; j++) { if(a[i] > a[j]) swap(a[i], a[j]); } } } string string_add(string a[], int len) { string ret = ""; for(int i =0; i< len; i++) { ret +=a[i] + "; "; } return ret; } int main() { string sa[7] = { "Hello World", "Horizon", "C#", "Java", "C++", "Python", "TypeScript" }; string_sort(sa, 7); for(int i=0; i<7; i++) { cout << sa[i] << endl; } cout << endl; cout <<string_add(sa, 7) <<endl; return 0; }
运行结果:
3. 标准库中的字符串类
(1)字符串流类:(<sstream>头文件)
-
标准库中提供了相关的类对字符串和数字进行转换
-
字符串流类(sstream)用于string的转换
-
istringstream:字符串输入流
-
ostringstream:字符串输出流
-
(2)字符串与数字的转换
string→数字 |
数字→string |
istringstream iss("123.45"); double num; iss>>num; |
ostringstream oss; oss<<543.21; string s = oss.str(); |
【编程实验】字符串和数字的转换 32-2.cpp
#include <iostream> #include <sstream> #include <string> using namespace std; //TO_NUMBER定义为宏主要目的是为了能将任意类型(如double,int) //的数字型字符串转为数字 #define TO_NUMBER(s, n) (istringstream(s)>>n) #define TO_STRING(n) (((ostringstream&)(ostringstream()<<n)).str()) int main() { double n = 0; //也可以是int if(TO_NUMBER("234.567", n)) { cout << n << endl; } string s = TO_STRING(12345); cout << s << endl; return 0; }
运行结果:
(3)string类的相关操作
①注意事项:
A. #include <string>。注意,不是<string.h>。
B. 分为string和wstring版。分别对应char和wchar_t
C. using std::string;或using std::wstring;
②string类的相关操作(点这里的链接)
【编程实验】用C++完成字符串的循环移位 33-3.cpp
#include <iostream> #include <string> using namespace std; string operator >> (const string& s, unsigned int n) { string ret = ""; unsigned int pos = 0; n = n % s.length(); pos = s.length() - n; ret = s.substr(pos); //pos后面的字符串放入ret ret += s.substr(0,pos);//在新的ret后面放入s的前pos个字符 return ret; } int main() { string s = "abcedfg"; string r = (s >> 3); cout << r << endl; return 0; }
运行结果:
4. 小结
(1)应用开发中大多数的情况都在进行字符串处理
(2)C++中没有直接支持原生的字符串类型
(3)标准库中通过string类支持字符串的概念
(4)string类支持字符串和数字的相互转换
(5)string类的应用使得问题的求解变得简单