• [C++从入门到精通] 带你彻底了解String类型的相关用法


    • 📢博客主页:https://loewen.blog.csdn.net
    • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
    • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
    • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨


    一. C++基本变量类型

    • 基本类型:int、double等。
    • 复合类型:引用、指针、const等。
    • 标准库类型:string(可变长字符串的处理)vector(一种集合或容器的概念)、迭代器。

    对于字符串,在现实生活中,string字符串无处不在。包括我们说的每一句话,例如,baidu.com,甚至写的文字也算是字符串的一种。


    二. String对象的定义和初始化

    ① 使用string类型前要

    #include 
    using namespace std;  //不包含该命名空间的话,需要使用std::string声明
    
    • 1
    • 2

    ② 定义和初始化string对象

    string s1;                   //默认初始化,s1 = “”,表空串,里面没有字符
    string s2("I Love China");   //把I Love China这个字符串内容拷贝到了s2代表的一段内存中,拷贝时不包括末尾的\0(字符串常量末尾默认有一个\0)
    string s3 = "I Love China";  //跟s2的写法效果一样
    string s4 = s2;              //把s2中的内容拷贝到了s4代表的一段内存中,但两者内存地址不同
    string s5(3, 'a');           //把s5初始化为连续3个字符‘a’组成的字符串,即s5 = “aaa”,这种方式不太推荐,因为会在系统内部创建临时对象,有点影响效率
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三. String对象的操作

    ① 判断是否为空empty(),返回bool类型

    std::string s1;
    
    if(s1.empty())
    {
        //字符串s1为空成立
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    size()length():返回字节/字符数量,代表该字符串的长度(unsigned int

    string s1;
    qDebug() << "s1的字符长度:" << s1.size();    //s1的字符长度:0
    qDebug() << "s1的字符长度:" << s1.length();  //s1的字符长度:0
    
    string s2 = "我是牛马!";
    qDebug() << "s2的字符长度:" << s2.size();    //s2的字符长度:9
    qDebug() << "s2的字符长度:" << s2.length();  //s2的字符长度:9
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    s[n]:返回s中的第n个字符(n是个整型值),n代表的是一个位置,位置从0开始,到.size()-1结束

    string s4 = "I Love China!";
    if(s4.size() > 4)
    {
        qDebug() << "s4[4] = " << s4[4];  //s4[4] = v
        s4[4] = 'w';       
        qDebug() << "s4 = " << s4;        //s4 = "I Lowe China!"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    s1+s2:字符串的连接,返回连接后的结果,其实就是得到一个新的string对象

    string s5 = “abcd”;
    string s6 = “abcd”;
    string s7 = s5 + s6;   
    qDebug() << "s7 = " << s7;  //s7 = "abcdabcd"
    
    • 1
    • 2
    • 3
    • 4

    s1 = s2:字符串对象赋值,s1里的内容被s2里面的内容所取代。


    s1 == s2:判断两个字符串是否相等(长度+字符同),大小写敏感(大小写字符是两个不同的字符)。


    s.c_str():将string类型转换成const char *

    string s8 = "abc";
    const char *p = s8.c_str();   //p指向s8的内存地址,内容也是"abc"
    
    char str[100];
    strcpy_s(str, sizeof(str), p);  
    qDebug() << "str = " << str;  //str = "abc"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    .c_str的引入是为了与C语言兼容,在C语言中没有string类型,所以我们得通过string类对象的c_str()成员函数把string对象转换成C语言中的字符串样式。

    我们在研究研究这段函数里面的内存情况,感兴趣的可以看看:

    通过在内存窗口输入&s8,得到s8的内存地址为0x010FFC6C(打开内存窗口方式:调试——窗口——内存——内存)

    在这里插入图片描述

    内存地址0x010FFC6C中结尾6C代表上面右边内存???.abc.???中的第一位,而const char *p = s8.c_str();中指针p指向s8中字符串真正的内存地址,所以应该是从6C开始跳过4位的a开始,所以指针p的内存地址为0x010ffc706C70相差就是4字节)。

    在这里插入图片描述
    strcpy_s(str, sizeof(str), p);将指针p中的内存赋值给字符数组str,其内的61 62 63代表abc00代表结束符/0

    在这里插入图片描述
    ps:因为对象中可能包含其他东西,所以内存中的或其他乱码是正常的。


    ⑧ 针对string使用范围for语句

    范围for:C++11中提供的一种能够遍历一个序列中的每一个元素的方法。

    string s9 = "I Love China";
    for(auto c : s9)     //auto:编译器自动推断变量c的类型,并为其不断分配内存,直到遍历结束
    {
        qDebug() << c;  //依次输出s9里面的内容
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    利用范围for语句,修改string中的内容

    string s9 = "I Love China";
    for(auto &c : s9)     //这里使用取地址符号,即c相当于s9中内容的别名,直接取代
    {
        
        c = toupper(c);   //因为c是一个引用,所以这相当于改变s9中的值
                          //toupper():把小写字符转成大写,大写字符没变化
        qDebug() << c;    //输出:I LOVE CHINA
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注:for(auto c : s9)for(auto &c : s9)相比,更推荐后置,引用方式更高效。


    下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。
  • 相关阅读:
    Pinely Round 1 (Div. 1 + Div. 2)
    系统性能调优:提升服务器响应速度
    win32com打开带密码excel
    Excel 宏录制与VBA编程 —— 13、Excel内置函数的调用
    行走的offer收割机,这份十万字Java面试总结已经帮助上百人拿到大厂offer,还不快冲?
    Windows操作系统 | CMD命令行查看当前用户名
    【数据可视化】Data Reduction和加利福尼亚的房价数据集数据可视化以及Kettle的初步介绍
    【Unity2D 2022:Particle System】添加粒子特效
    【Leetcode】667. 优美的排列 II
    Mac系统补丁管理
  • 原文地址:https://blog.csdn.net/weixin_43197380/article/details/126130830