33-C++中的字符串类

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。

测试环境:Ubuntu 10.10

GCC版本:9.2.0

 

一、历史遗留问题

1)C语言不支持真正意义上的字符串

2)C语言用字符数组和一组函数实现字符串操作

3)C语言不支持自定义类型,因此无法获得字符串类型

 

二、解决方案

1)C到C++的进化过程引入了自定义类型

2)在C++中可以通过类完成字符串类型的定义

            问题:

            C++中的原生类型系统是否包含字符串类型?

                    C++原生类型没有字符串类型!

 

三、标准库中的字符串类

1)C++语言直接支持C语言的所有概念

2)C++语言中没有原生的字符串类型

3)C++标准库提供了string类型

        -    string直接支持字符串连接

        -    string直接支持字符串的大小比较(为了字符串排序)

        -    string直接支持子串查找和提取

        -    string直接支持字符串的插入和替换

               ……(具体查找C++标准库)

 

编程实验
字符串类的使用
33-1.cpp
#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++) //a[0]和所有字符串比较大小,a[1]和所有字符串比较大小
        {
            if( a[i] > a[j] )   //类对象大小比较,因此比较操作符大小重载
            {//把最小的的字符串放在最前边
                swap(a[i], a[j]);  //字符串大小比较时,会严格比较每个字符串中的字符,类似字典排序
            }
        }
    }
}
//总循环次数=7+6+5+4+3+2+1=28(上边例子有意思,每次i都会重新赋值给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;
}

操作:

1) g++ 33-1.cpp -o 33-1.out编译正确,打印结果:

C#
C++
D.T.Software
Hello World
Java
Python
TypeScript
 
C#; C++; D.T.Software; Hello World; Java; Python; TypeScript

 

补充知识:

1)字典排序:a1a、a1b2、a1b3……

字符串比较会严格按照ASCII进行比较每个字符!

 

4) 字符串数字的转换

        -    标准库中提供了相关的类对字符串和数字进行转换

        -    字符串流类(sstream)用于string的转换

            * <sstream> - 相关头文件

            * istringstream - 字符串输入流

            * ostringstream - 字符串输出流

 

5) 使用方法

        -    string->数字

              istringstream iss("123.45")   //字符串输入流,放入到流对象iss里

              double num;

              iss >> num;   //对象的内容传入到num里,>>返回值是一个bool类型

        -    数字->string

              ostringstrem oss;      //定义字符串输出流对象 oss

              oss << 543.21;          //对象里有543.21        

              string s = oss.str();   //通过流对象的str成员函数,就能得到对应的字符串

 

编程实验
字符串和数字的转换
33-2.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&类型
/* 
bool to_number(const string& s, int& n)
{ 
    istringstream iss(s);   //定义对象类型istringstream,类名iss,初始值为s
    return iss >> n;   //iss数值给n,>>返回值为bool类型
} 
 
bool to_number(const string& s, double& n)
{ 
    istringstream iss(s);   //定义对象类型istringstream,类名iss,初始值为s
    return iss >> n;   //iss数值给n,>>返回值为bool类型
} 
……要想创建很多类型,这样复制很累,因此用宏解决,很巧妙啊;后边也可以用模板解决 
*/
 
int main()
{

    double n = 0;
   
    if( TO_NUMBER("234.567", n) )  //如果传输成功,就输出,证明>>表达式是bool类型
    {
        cout << n << endl;    //234.567
    }

    string s = TO_STRING(12345);

    cout << s << endl;     //字符串:12345
    
    return 0;
}

操作:

1) g++ 33-2.cpp -o 33-2.out编译正确,打印结果:

234.567
123456    

 

四、面试题分析

1)字符串循环右移

        -    示例:

            * abcdefg循环右移3位后得到efgabcd

               (1)找准位置分割点,和3有关

               (2)将字符串分成2个子串1和2

               (3)子串2放到前边,子串1接着2的尾巴放

编程实验
用C++完成面试题
33-3.cpp
#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();
    pos = s.length() - n;   //查找右移位置
    ret = s.substr(pos);    //提取子串,赋值给ret。pos位置后子串给ret
    ret += s.substr(0, pos);  //从0到pos提取子串,再次放到前边
    //过程分析
    // abcdefg ==> 8  等于
    // abcdefg ==> 1 
    // 8 % 7 ==> 1 
    // 6.1 ==> 6
    //abcdef g
    // ret ==> g    //
    // ret = g + abcdef   //
    // ret = gabcdef 
    return ret;
}

int main()
{
    string s = "abcdefg";
    string r = (s >> 3);
    
    cout << r << endl;
    
    return 0;
}

操作:

1) g++ 33-3.cpp -o 33-3.out编译正确,打印结果:

efgabcd

 

C++中substr函数的用法
#include<string>
#include<iostream>
using namespace std;
main()
{
string s("12345asdf");
string a=s.substr(0,5);       //获得字符串s中 从第0位开始的长度为5的字符串//默认时的长度为从开始位置到尾
cout<<a<<endl;
}
输出结果为:
12345

 

小结

1)应用开发中大多数的情况都在进行字符串处理

2)C++中没有直接支持原生的字符串类型

3)标准库中通过string类支持字符串的概念

4)string类支持字符串数字的相互转换

5)string类的应用使得问题的求解变得简单

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值