C++字符串类

字符串我们在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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值