• C++字符串操作【超详细】


    零.前言

    本文将重点围绕C++的字符串来展开描述。

    其中,对于C/C++中字符串的一些区别也做出了回答,并对于C++的(string库)进行了讲解,最后我们给出字符串的不同表达形式

    开发环境

    VS2022

    一.字符串常量跟字符串变量

    1.1字符串常量

    字符常量是什么呢?顾名思义就是一段已经在内存中确定下来的字符串,并且这块内存中的字符串无法改变。

    例如:"ABC"、"ASD233"、"sdasd16.."等等都是字符串常量

    在C++中使用:

    1. #include<iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. cout << "abc" << "是一个字符串常量" << endl; //abc是一个字符串常量
    6. }

    1.2字符串变量:

    对于字符串变量,在C++中有三种实现方式:“数组”、“指针变量”、“string类对象”。

    数组:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. char eg1[10] = "abc"; //直接初始化
    6. char eg2[10]; //后面通过输入初始化
    7. cin >> eg2; //此处输入def
    8. cout << eg1 << endl; //abc
    9. cout << eg2 << endl; //def
    10. }

    运行结果:

    指针变量:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. char eg1[10] = "abc"; //数组
    6. char *eg2 = eg1; //指针变量
    7. cout << eg1 << endl; //abc
    8. cout << eg2 << endl; //abc
    9. }

    运行结果:

    string类对象:

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s1 = "123"; //利用“=”来初始化
    7. string s2("456"); //利用“()”来初始化,和上面本质一样
    8. string s3 = s1; //利用“string”类对象来初始化
    9. string s4(s2); //和上面本质一样
    10. char eg[10] = "abc";
    11. string s5 = eg; //利用“eg数组”来初始化
    12. cout << s1 << endl; //123
    13. cout << s2 << endl; //456
    14. cout << s3 << endl; //123
    15. cout << s4 << endl; //456
    16. cout << s5 << endl; //abc
    17. }

    运行结果:

    二.字符串的读取

    为方便起见,后续的所有字符串都将以string类对象的形式进行讲解。

    2.1cin函数

    没啥好说的,最简单也是最开始学习到的读取函数,可以读取字符串,遇到“空格”、“回车”、“Tab”等制表格符号结束读取。

    ps:不会读取空格,空格并不会被存储!!!

    例如:

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. string s;
    6. cin >> s; //在这里输入ABC
    7. cout << s << endl; //输出ABC
    8. cin >> s; //在这里输入A B C
    9. cout << s << endl; //输出A
    10. }

    运行结果:

     2.2getline()函数

    getline函数相对于cin函数最大的区别在于“getline可以读取空格,遇到回车才结束

    getline()函数格式:

    getline(cin,变量名)

    例如:

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s;
    7. getline(cin, s); //这里输入A B C D
    8. cout << s << endl; //输出A B C D
    9. }

    运行结果:

    2.3cin.getline()函数

    cin.getline()函数可以理解为是getline()函数的“超集”。

    getline函数读取的是“string流(字符串流)”。

    cin.getline函数读取的是“iostream流(输入输出信息流)”。

    cin.getline函数遇到“空格”也会读取,不过跟getline函数最大的区别是“cin.getline()”函数可以指定读取的字符个数!!

    cin.getline()函数格式:

    cin.getline(变量名,读取字符的个数,结束字符)

    其中,前两个参数必须有,第三个参数可以没有,默认为'\0'

    PS:"cin.getline()函数只能给'数组'形式的字符串使用,而getline()函数只能给'string类对象'形式的字符串使用"

    例如:

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. char s[10];
    7. cin.getline(s,3); //输入ABCD
    8. cout << s << endl; //输出AB,原因在于最后一个字符存储了'\0',因此把C挤掉了。
    9. }

    运行结果:

    getline()cin.getline()错误示例

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. char eg1[10];
    7. string eg2;
    8. cin.getline(eg2, 5); //报错,cin.getline()函数只能给'数组'形式字符串使用
    9. getline(eg1); //报错,getline()函数只能给'string类对象'形式字符串使用
    10. }

    三.string类对象的操作

    3.1string类对象字符串拼接、比较操作

    "+"、">"、"<"、">="、"<="、"!="、"=="等符号在string类对象中都是允许的,具体规则如下:

    "+":

    "+"被用于两个字符串对象相加(首尾拼接)

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s1 = "ABC";
    7. string s2 = "DEF";
    8. cout << s1 + s2 << endl; //输出ABCDEF
    9. }

    "=="、"!=":

    "=="被用于比较两个字符串是否相等(区分大小写、区分位置)
     

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s1 = "ABC";
    7. string s2 = "ABC";
    8. string s3 = "abc";
    9. string s4 = "CBA";
    10. if(s1 == s2)
    11. cout << "s1,s2两个相等" << endl;
    12. else
    13. cout << "s1,s2两个不相等" << endl;
    14. //输出相等
    15. if(s1 == s3)
    16. cout << "s1,s3两个相等" << endl;
    17. else
    18. cout << "s1,s3两个不相等" << endl;
    19. //输出不相等
    20. if(s1 == s4)
    21. cout << "s1,s4两个相等" << endl;
    22. else
    23. cout << "s1,s4两个不相等" << endl;
    24. //输出不相等
    25. }

    运行结果:

    "!="被用来比较两个字符串是否“不相等”(区分位置、区分大小写

    道理和上面的"=="一样,在这里就不赘述了。

    ">"、"<"、">="、"<=":

    这四个符号用来给字符串进行大小比较(依照字典序进行比较)

    字典序:

    a > b >c > ... > z > A > B > C > ... > Z

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s1 = "aB";
    7. string s2 = "AB";
    8. if (s1 > s2)
    9. cout << "s1>s2" << endl;
    10. else
    11. cout << "s1 << endl;
    12. //输出s1>s2
    13. }

    ps:“按照字典序从第一个位置开始挨个比较

    例如“bA”大于“Ba”,那是因为b在第一个位置并且大于B,尽管后面的A小于a,但那是第二个位置了。

    位置的优先级 > 字典序的优先级

    3.2string类对象常见函数

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s = "ABC";
    7. cout << s.empty() << endl; //判断s是否为空,为空返回Ture(1),不为空返回False(0)
    8. cout << s.length() << endl; //计算s的字符串长度
    9. cout << s.size() << endl; //同上
    10. cout << s[2] << endl; //跟字符数组一样,利用下标索引访问字符串中某个字符
    11. cout << s[3] << endl; //空字符也是存在的,这里就输出空字符'\0'
    12. //运行结果//
    13. 0
    14. 3
    15. 3
    16. C
    17. '\0',其实这个空字符在cmd命令控制窗口中就是一个空白.
    18. }

    运行结果:

     3.3修改string类对象的操作

    3.3.1insert函数->插入:

    s.insert(pos,k):

    在字符串s下标索引pos之前插入字符串k

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s = "ABC";
    7. s.insert(2, "66");
    8. cout << s << endl; //输出AB66C
    9. }

     3.3.2erase函数->删除:

    erase(pos,len):

    删除从 pos 开始的 len 个字符(包括位置pos)。如果 len 省略,则删除 pos 开始的后面所有字符。

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s = "ABCDEF";
    7. s.erase(2, 2);
    8. cout << s << endl; //输出ABEF
    9. }

    3.3.3replace函数->替换:

    s.replace(start,len,rp):

    将字符串s中下标索引start开始共len个字符替换为字符串rp

    其中,删除的字符数量可以和要替换的字符串rp长度不一致

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s = "ABCD";
    7. s.replace(1, 2, "6666");
    8. cout << s << endl; //输出A6666D
    9. }

    3.3.4find函数->查找:

    s.find(st):

    在字符串s中查找字符串st第一次出现的位置,返回下标索引。

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s = "ABCDEFAB";
    7. cout << s.find("AB") << endl; //输出0
    8. }

     3.3.5rfind函数->查找:

    s.rfind(st):

    在字符串s中查找字符串st最后一次出现的位置,返回下标索引。

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s = "ABCDEFAB";
    7. cout << s.rfind("AB") << endl; //输出6
    8. }

    3.3.6reverse函数->反转字符串:

    s.reverse(start,end):

    将字符串s下标索引[start,end]之间的字符串反转

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s = "ABCDEF";
    7. reverse(s.begin(), s.end());
    8. cout << s << endl; //FEFCBA
    9. }

    3.3.7substr函数->截取字符串:

    s.substr(pos,len):

    将字符串s从下标索引pos开始连续截取len个长度的字符串。

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. string s = "ABCDEF";
    7. string ss = s.substr(1, 3);
    8. cout << ss << endl; //BCD
    9. }

  • 相关阅读:
    使用docker-compose命令行向远程主机编排容器
    mac 查看音频信息
    定制ASP.NET 6.0的应用配置
    机器学习第八课--决策树
    ubuntu18.04安装qgis、pyqgis
    把第三方jar引入到maven中
    IOS 设置UIViewController为背景半透明浮层弹窗,查看富文本图片详情
    【MySql】mysql之进阶查询语句
    C# WebService 发布到本地IIS----局域网访问/外网访问
    4面全过之后还有交叉面,阿里新零售Java岗面试也太“刺激”了
  • 原文地址:https://blog.csdn.net/zheshiyangyang/article/details/136588537