字符串我们在C语言中其实已经学习过了,在C语言中学习字符串我们用的是另一个概念,字符数组,也就是在C语言中没有真正意义上的字符串,用字符数组模拟字符串,C++语言直接支持C语言的所有概念,C++语言中没有原生的字符串类型,但是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] )// >是操作符重载,标准库提供给我们string对象的操作符函数
{
swap(a[i], a[j]);
}
}
}
}
string string_add(string a[],int len)
{
string ret = " ";
int i = 0;
for(i;i<len;i++)
{
ret += a[i] + ";"; //+=是操作符重载,标准库提供给我们string对象的操作符函数
}
return ret;
}
int main()
{
string s[5]=
{
"APPLE",
"CLOSE",
"DUBLE",
"KILL",
"LINUX"
};
string_sort(s,5);
for(int i=0;i<5;i++)
{
cout<<s[i]<<endl;
}
cout<<string_add(s,5)<<endl;
return 0;
}
结果:
sice@sice:~$ ./a.out
APPLE
CLOSE
DUBLE
KILL
LINUX
APPLE;CLOSE;DUBLE;KILL;LINUX;
在标准库里面操作符重载是相当常见的,这个字符串类它就大量使用了操作符重载,所以两个字符串的连接使用+非常直观,实现更加简洁
标准库中提供了相关的类对字符串和数字进行转换,字符串流类(sstream)用于string的转换,头文件为,字符串输入流为istringstream,字符串输出流为ostringstream,看下图,又使用了操作符重载的概念,istringstream类里面定义了操作符重载函数(iss>>num,返回布尔类型),重载了操作符>>,将字符串转化为数字,数字到string是同样的道理,oss<<543.21重载操作符函数返回oss本身,oss是iostream类型
例子:
sice@sice:~$ cat test.cpp
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
bool to_number(const string& s,int& n)
{
istringstream iss(s);
return (iss>>n);
}
void to_string(int n)
{
ostringstream oss;
oss<<n;
string s = oss.str();
cout<<s<<endl;
}
int main()
{
int n = 0;
cout<<to_number("123",n)<<endl;
cout<<n<<endl;
to_string(1);
return 0;
}
结果:
sice@sice:~$ ./a.out
1
123
1
``
这样就显得很麻烦,因为不同类型的数字我们就得重新写一个函数,现在用宏来使用
改进:
```cpp
#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())//一样产生一个临时对象,强制转化返回值类型为ostringstream
int main()
{
double n = 0;
if( TO_NUMBER("234.567", n) )
{
cout << n << endl;
}
string s = TO_STRING(12345);
cout << s << endl;
return 0;
}
结果:
sice@sice:~$ gedit test.cpp
sice@sice:~$ g++ test.cpp
sice@sice:~$ ./a.out
234.567
12345
字符串循环右移,比如abcd循环右移1位后得dabc,实现如下
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
string operator >>(const string&s,int n)
{
string ret = "";
unsigned int pos = 0;
n = n%s.length();
pos = s.length()-n;//找到开始右移的起始位
ret = s.substr(pos);//把需要右移的截出来放开头
ret += s.substr(0,pos);//把剩下的部分接上
return ret;
}
int main()
{
string s = "abcd";
string ret = s>>1;
cout<<ret<<endl;
return 0;
}
结果:
sice@sice:~$ ./a.out
dabc