C++深度解析 C++中的字符串类 --- string类,字符串与数字之间的转换,istringstream,ostringstream,字符串循环右移(32)
C++标准库提供了string类型
- string 直接支持字符串连接
- string 直接支持字符串的大小比较
- string 直接支持子串查找和提取
- string 直接支持字符串的插入和替换
示例程序:(字符串类的使用)
#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",
"D.T.Software",
"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;
}
结果如下:
标准库中的字符串类
字符串与数字的转换
字符串流类(sstream)用于string的转换
<sstream>:相关头文件
istringstream:字符串输入流
ostringstream:字符串输出流
字符串string 到 数字 的转换
istringstream iss("123.45");
double num;
iss >> num;
数字 到 字符串string 的转换
ostringstream oss;
oss << 543.21;
string s = oss.str();
示例程序一:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
istringstream iss("123.45");
double num;
//转换成功,返回bool类型
if (iss >> num)
{
cout << num << endl; //123.45
}
ostringstream oss;
//转换成功,返回bool类型
if (oss << 543 << "." << 21)
{
string s = oss.str();
cout << s << endl; //543.21
}
return 0;
}
结果如下:
示例程序二:(通过宏定义,来适应不同的类型)
#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;
return 0;
}
结果如下:
面试题分析
字符串循环右移
示例:
abcdefg 循环右移3位得到efgabcd
示例程序一:(使用字符串类来实现上述的功能)
#include <iostream>
#include <string>
using namespace std;
//参数n:需要循环右移的位数
string right_func(const string& s, unsigned int n)
{
// abcdefg ==>3 efg abcd
// abc ==>1 cba
// abc ==>3 abc ==>1 cab
string ret = "";
unsigned int pos = 0;
n = n % s.length();
pos = s.length() - n;
//提取子串,从pos位置开始,直接将字符串剩余的部分作为子串提取出来
ret = s.substr(pos);
//从0开始,到pos位置,作为子串提取出来
ret += s.substr(0, pos);
return ret;
}
int main()
{
string r = right_func("abcdefg", 8);
cout << r << endl;
return 0;
}
结果如下:
示例程序二:(使用操作符重载 >>)
#include <iostream>
#include <string>
using namespace std;
//参数n:需要循环右移的位数
string operator >> (const string& s, unsigned int n)
{
// abcdefg ==>3 efg abcd
// abc ==>1 cba
// abc ==>3 abc ==>1 cab
string ret = "";
unsigned int pos = 0;
n = n % s.length();
pos = s.length() - n;
//提取子串,从pos位置开始,直接将字符串剩余的部分作为子串提取出来
ret = s.substr(pos);
//从0开始,到pos位置,作为子串提取出来
ret += s.substr(0, pos);
return ret;
}
int main()
{
string s = "abcdefg";
string r = (s >> 3);
cout << r << endl;
return 0;
}
结果如下:
小结
应用开发中大多数的情况都在进行字符串处理
C++中没有直接支持原生的字符串类型
标准库中通过string类支持字符串的概念
string类支持字符串和数字的相互转换
string类的应用使得问题的求解变得简单