当前位置 博文首页 > Dada_ping的博客:C++之字符串类学习总结

    Dada_ping的博客:C++之字符串类学习总结

    作者:[db:作者] 时间:2021-06-14 15:36

    一、回顾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]?)
    ????????????{
    ????????????????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",
    ??????"linux",
    ??????"risc-v",
    ??????"rust",
    ??????"c++",
    ??????"golang",
    ??????"c"
    ????};
    ????
    ????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;
    }
    
    

    运行结果:

    root@txp-virtual-machine:/home/txp/tt#?./a.out
    c
    c++
    golang
    hello?world
    linux
    risc-v
    rust
    
    c;c++;golang;hello?world;linux;risc-v;rust;
    
    

    三、字符串与数字的转换:

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

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

    相关头文件

    • istringstream字符串输入流

    • ostringstream字符串输出流

    1、方法使用

    string---数字

    istringstream?iss("123.45");
    ??
    double?num;
    ??
    iss>>num
    ??
    注:传输成功,表达式值为?true,失败则为?false;
    

    数字---string

    ostringsream?oss;
    
    oss?<<?543.21;
    ??
    string?s?=?oss.str();
    

    代码示例:

    #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;
    }
    
    

    输出结果:

    root@txp-virtual-machine:/home/txp/tt#?./a.out
    234.567
    12345
    
    

    2、字符串循环右移

    比如说"abcdefg"循环右移3位后得到efgabcd

    代码示例:

    #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);?//从?pos?开始直到末尾提取子串
    ??? ret += s.substr(0, pos);//原来的字符串并没有被破坏,提取到 pos 之前的字符;
    ????
    ????return?ret;
    }
    
    int?main()
    {
    ????string?s?=?"abcdefg";
    ????string?r?=?(s?>>?3);
    ????
    ????cout?<<?r?<<?endl;
    ????
    ????return?0;
    }
    
    

    输出结果:

    root@txp-virtual-machine:/home/txp/tt#?./a.out
    efgabcd
    
    

    3、小结:

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

    • c++中没有直接支持原生的字符串类型

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

    • string类支持字符串和数字的互换转换

    • string类的应用使得问题的求解变得更加简单

    好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。我是txp,下期见!