版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1.历史遗留问题
- C语言不支持真正意义上的字符串
- C语言用字符数组和一组函数实现字符串操作
- C语言不支持自定义类型,因此无法获得字符串类型
2.解决方案
- 从C到C++的进化过程引入了自定义类型,在C++中可以通过类完成字符串类型的定义
- 问题: C++中的原生类型系统是否包含字符串类型?
3.标准库中的字符串类
- C++语言直接支持C语言的所有概念
- C++语言中没有原生的字符串类型
- C++标准库提供了string类型
string
直接支持字符串连接string
直接支持字符串的大小比较string
直接支持子串查找和提取string
直接支持字符串的插入和替换
4.字符串类的使用
4.1 字符串的排序和添加
-
#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",
-
"future",
-
"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;
-
-
system(
"pause");
-
-
return
0;
-
}
- 运行结果
4.2 字符串与数字的转换
- 标准库中提供了相关的类对字符串和数字进行转换
- 字符串流类(
sstream
)用于string
的转换- <sstream> (相关头文件 ),
- istringstream (字符串输入流 ),ostringstream (字符串输出流 )
- 使用方法:
- string >> 数字
-
istringstream iss("123.45");
-
double num;
-
iss >> num;
- 数字 >> string
-
ostringstream oss;
-
oss <<
543.21
-
string s = oss.str();
- iss >> num返回的是bool类型(在重载函数中,转换成功返回true),oss << 543.21返回的是对象oss
-
#include <iostream>
-
#include <sstream>
-
#include <string>
-
-
using
namespace
std;
-
-
#define TO_NUMBER(s,n) (istringstream(s) >> n)
-
#define TO_STRING(n) (((ostringstream &)(ostringstream() << n)).str())
-
-
int main()
-
{
-
double n =
0;
-
if (TO_NUMBER(
"234.567", n))
-
{
-
cout << n <<
endl;
-
}
-
string s = TO_STRING(
12345);
-
cout << s <<
endl;
-
-
system(
"pause");
-
-
return
0;
-
}
- 运行结果:
- 此处的宏定义比较巧妙,一般思路会使用多个函数进行不同数据类型的转换,但同样的函数体多次设置造成资源浪费。可以考虑使用后面学到的函数模版来进行实现,此处用宏定义的方法同样可以实现,更为简洁。
- 可以用函数调用,实现如下:
-
#include <iostream>
-
#include <sstream>
-
#include <string>
-
-
using
namespace
std;
-
-
bool to_number(string &s, double &dnum)
-
{
-
istringstream iss(s);
-
-
return (iss >> dnum);
-
}
-
-
string to_string(string &s, double &dnum)
-
{
-
ostringstream oos;
-
-
oos << dnum;
-
-
return oos.str();
// ((ostringstream&)(ostringstream()?<<?n)).str()??
-
}
4.3 面试题分析——字符串循环右移
- 字符串循环右移
- 示例: abcdefg循环右移3位后得到efgabcd
-
#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();
// 移动n位相当于不移动
-
pos = s.length() - n;
-
ret = s.substr(pos);
// 循环移位实质就是对子串进行搬移拼接
-
ret += s.substr(
0, pos);
-
-
return ret;
-
}
-
-
int main()
-
{
-
string s =
"abcdefg";
-
string r = (s >>
3);
-
-
cout <<
"移位前: " << s <<
endl;
-
cout <<
"移位后: " << r <<
endl;
-
-
system(
"pause");
-
-
return
0;
-
}
- 运行结果:
5.小结
- 应用开发中大多数的情况都在进行字符串处理
- C++中没有直接支持原生的字符串类型
- 标准库中通过string类支持字符串的概念
- string类支持字符串和数字的相互转换
- string类的应用使得问题的求解变得简单