• C++ 33.C++中的字符串类-狄泰软件学院


    C语言字符串的历史

    • C语言不支持真正意义上的字符串
    • C语言用字符数组和一组函数实现字符串操作
    • C语言不支持自定义类型,因此无法创建字符串类型

    当年C语言主要用于开发UNIX操作系统,处理字符串的情况少,所以在当时的背景下没有让C语言中内置一个字符串类型。后来C语言越用越广泛,没办法只能用字符数组模拟字符串。在开发应用程序时,处理字符串的情况非常多,如果还使用字符数组处理字符串,那么开发效率就会很低,因此在C++中,就要引入字符串的概念。

    C++字符串的解决方案

    • C++同样不支持真正意义上的字符串
    • C++支持自定义类型
    • C++可以通过类完成字符串类型的定义
    • C++完全兼容C,在C++中同样支持使用字符数组和一组函数来实现字符串的操作。

    C++中可以自定义类类型,定义一些成员函数,重载操作符。所以在C++中完全可是使用类类型实现字符串类型。

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

    • C++语言直接支持C语言的所有概念
    • C++语言中没有原生的字符串类型。

    C++标准库中提供了string类类型

    这个类类型完全实现了字符串的概念

    • string支持字符串连接
    • string支持字符串的大小比较
    • string支持字符串查找和提取
    • string支持字符串的插入和替换

    1. 字符串连接:

    #include   
    #include   
    
    using namespace std;
    
    int main() 
    {
        string str1 = "Hello";
        string str2 = "World";
        string str3 = str1 + " " + str2;
        cout << str3 << endl;
        cin.get();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出:Hello World

    2. 字符串大小比较:

    #include   
    #include   
      
    using namespace std;  
      
    int main() 
    {  
        string str1 = "Apple";  
        string str2 = "Banana";  
        if (str1 < str2) 
            cout << str1 << " < " << str2 << endl; 
        else if (str1 > str2) 
            cout << str1 << " > " << str2 << endl; 
        else 
            cout << "字符相等." << endl;
        cin.get();
        return 0;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    输出:Apple < Banana

    3. 字符串查找和提取:

    #include   
    #include   
    
    using namespace std;
    
    int main() 
    {
        string str = "Hello, World!";
        size_t pos = str.find("World"); // 查找字符串"World"的位置  
        if (pos != string::npos) 
        { 
            // 如果找到了字符串"World"  
            string sub_str = str.substr(pos, 5); // 提取从位置pos开始的5个字符  
            cout << sub_str << endl;
        }
        else
            // 如果找不到字符串"World"  
            cout << "找不到字符串." << endl;
        cin.get();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    输出:World

    4.字符串插入和替换:

    #include   
    #include   
    
    using namespace std;
    
    int main() 
    {
        string str = "Hello, World!";
        str.insert(7, "Beautiful "); // 在位置7插入字符串"Beautiful "  
        cout << str << endl;
        str.replace(7, 9, "Nice"); // 从位置7开始,替换9个字符为"Nice"  
        cout << str << endl;
        cin.get();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出:
    Hello, Beautiful World!
    Hello, Nice World!

    5.字符串排序

    #include 
    #include   
    
    using namespace std;
    
    //对字符串进行由小到大排序 选择排序
    void SortString(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]);
    			} 
    		}
    	}
    	return;
    }
    
    int main()
    {
    	string sa[5] = { "1","2","3","10","11" };
    	SortString(sa, 5);
    	for (int i = 0; i < 5; i++)
    	{
    		cout << sa[i] << endl;
    	}
    	cin.get();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    输出:
    1
    10
    11
    2
    3

    • 直接使用 >就可以进行字符串比较
    • a[]作为函数参数,传递的是数组的的首地址,而不是数组副本,所以在函数内部可以修改数组的值。
    • std::swap()可用于交换两个元素或者对象的值。可用于任何数据类型,包括内置类型(例如:intdouble)复杂类型(例如:类、结构体)。

    6.字符串连接

    #include 
    #include 
    
    using namespace std;
    
    string AddString(string a[], int len)
    {
        string ret = "";
    
        for (int i = 0; i < len; i++)
        {
            ret += a[i] + "-";
        }
    
        return ret;
    }
    
    int main()
    {
        string sa[5] =
        {
            "狄泰",
            "学院",
            "的",
            "同学们",
            "求个关注",
        };
    
        cout << AddString(sa, 5) << endl;
        cin.get();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    输出
    狄泰-学院-的-同学们-求个关注-

    • 使用+可以进行字符串连接
    • ret += a,等价于 ret = ret + a
    • 在标准库中操作符重载是相当常见的,字符串类大量得使用了字符串重载。
    • 在C++中不需要使用字符数组模拟字符串了,直接使用string类。代码中,字符指针 char* 不再出现。

    字符串与数字的转换

    • 标准库中提供了相关的类对字符串和数字进行转换
    • 字符串流类 sstream 用于string 的转换
    • 头文件是 sstream
    • 字符串输入流 istringstream
    • 字符串输出流 ostringstream

    1.string -> 数字

    #include   
    #include   
    #include   
    using namespace std;
    int main() 
    {
        string str = "3.14";
        // 定义字符串输入流,并传入一个str
        istringstream iss(str);
        // 定义一个double用于接收
        double num;
        if(iss >> num)
        	std::cout << "num: " << num << std::endl;
        cin.get();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出: 3.14

    • iss >> num有一个布尔类型的返回值,用于判断传输是否成功

    2.数字 -> string

    #include   
    #include   
    #include   
    using namespace std;
    int main() 
    {
        // 定义字符串输出流
        ostringstream oss;
        int num = 123;
        oss << num;
        // 返回字符串
        string str = oss.str();
        cout << str << endl;
        cin.get();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出: 123

    • 使用oss.str()返回输出流的字符串。
    • oss << num;也有返回值,返回的是流本身。oss << 123;等价于oss <<1<<2<<"3";

    3.使用宏进行数字与字符串的转换

    #include 
    #include 
    #include 
    
    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("3.1415926", n))
            cout << n << endl;
    
        string s = TO_STRING(12345);
    
        cout << s << endl;
        std::cin.get();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    输出
    3.14159
    12345

    4.重载了右移运算符">>",使其在字符串上执行循环右移操作

    #include   
    #include   
    
    using namespace std;  
      
    // 重载右移运算符">>"
    string operator >> (const string& s, unsigned int n)  
    {  
        string ret = "";  
        unsigned int pos = 0;  
          
        // 使n对s的长度取模,防止n大于s的长度导致的无效右移  
        n = n % s.length();  
        // 计算开始切割的位置
        pos = s.length() - n;  
        // 从pos位置开始切割字符串,得到子字符串ret  
        ret = s.substr(pos);  
        // 从0位置开始切割字符串,得到子字符串tmp  
        string tmp = s.substr(0, pos);  
        // 将tmp添加到ret的尾部,完成循环右移操作  
        ret += tmp;  
    
        return ret;  
    }  
      
    int main()  
    {  
        string s = "abcdefg";  
        string r = (s >> 3);  
        cout << r << endl;  
        return 0;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    输出
    abcdefg
    efgabcd

    5.字符串反转

    要求:
    “we;tonight;you” -> “ew;thginot;uoy”

    #include 
    #include 
    
    using namespace std;
    
    string reverse(const string& s, const char c)
    {
        string ret = "";
    
        return ret;
    }
    
    int main()
    {
        cout << reverse("", ';') << endl;                 // 输出:空字符串
        cout << reverse(";", ';') << endl;                // 输出:;
        cout << reverse("abcde;", ';') << endl;           // 输出:edcba;
        cout << reverse("we;tonight;you", ';') << endl;   // 输出:ew;thginot;uoy
        cin.get();
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    输出

  • 相关阅读:
    简化开发流程,消除重复任务:refine 帮您轻松搞定 | 开源日报 No.63
    03、主动信息收集
    NR 5G 终端TMSI上报
    jupyter notebook 调整深色背景与单元格宽度与自动换行
    最新ACR15.0新功能如何使用?ps插件camera raw15.0mac版新功能教程
    玄机-第一章 应急响应- Linux入侵排查
    QT中如何对引入的第三方库进行翻译
    代码随想录(番外)图论3|1020. 飞地的数量|130. 被围绕的区域
    创新工具 | 快速创作高质量SEO博文的6个技巧
    【Android进阶】4、UI状态的保存和恢复
  • 原文地址:https://blog.csdn.net/WangPaiFeiXingYuan/article/details/133337653