C++深度解析 C++中的字符串类 --- string类,字符串与数字之间的转换,istringstream,ostringstream,字符串循环右移(32)

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类的应用使得问题的求解变得简单

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值