• 【C++程序员必修第一课】C++基础课程-10:C++ 字符串


    1 本课主要内容:

    • 字符串的使用场景?
    • C 风格字符串 (char*) 的定义,及常用函数使用
    • C++ 标准库字符串 (std::string) 及常用函数使用

    2 主动知识点:

    • 字符串的使用场景?

    字符串类型可以用来表示各种名称、地址、描述、备注等文本数据;主要有 C 风格字符串(char*)和 C++ 风格字符串(std::string、std::wstring)二种字符串;

    • C 风格字符串 (char*) 的定义

    例子如下:

    1. #include
    2. // 例子1
    3. char s1[260]{ "abcd" };
    4. std::cout << "s1:" << s1 << std::endl;
    5. // 例子2
    6. char s2[260]{""};
    7. strcpy(s2, "abcd");
    8. std::cout << "s2:" << s2 << std::endl;
    9. // 例子3
    10. const char* s3 = "abcd";
    11. std::cout << "s3:" << s3 << std::endl;
    12. // 例子4
    13. char* s4 = new char[260];
    14. strcpy(s4, "abcd");
    15. std::cout << "s4:" << s4 << std::endl;
    16. delete[] s4;
    • C 风格字符串常用函数使用

    1. #include
    2. char s1[260]{ "1111" };
    3. char s2[260]{ "22222222222211113333aaaa456" };
    4. // 复制字符串
    5. strcpy(s1, "aaaa");
    6. // 计算字符长度
    7. size_t len1 = strlen(s1);
    8. std::cout << "s1:" << s1 << ", strlen:" << len1 << std::endl;
    9. // 比较字符串:(s1s2)=1
    10. const int cmp = strcmp(s1, s2);
    11. std::cout << s1 << " strcmp " << s2 << " = " << cmp<< std::endl;
    12. // 查找字符
    13. const char* s3 = strchr(s2, '1'); // 查找字符,找不到返回nullptr
    14. const int findIndex1 = (nullptr == s3) ? -1 : (s3 - s2); // 计算查找字符排序;找不到-1
    15. std::cout << s2 << " strchr " << '1' << " = " << findIndex1 << std::endl;
    16. // 查找子字符串
    17. const char* s4 = strstr(s2, s1); // 查找子字符串,找不到返回nullptr
    18. const int findIndex2 = (nullptr == s4) ? -1 : (s4 - s2); // 计算查找子字符串排序;找不到-1
    19. std::cout << s2 << " strstr " << s1 << " = " << findIndex2 << std::endl;
    20. // 字符串拼接
    21. char stemp[260];
    22. strcpy(stemp, s1);
    23. const char* s5 = strcat(s1, s2); // 把s2拼接到s1的后面,同时把字符串指针返回s4;(s1==s4)
    24. std::cout << stemp << " strstr " << s2 << " = " << s5 << std::endl;
    25. // 格式化字符串
    26. char s6[260];
    27. int i = 100;
    28. float f = 200.123;
    29. const char* str = "Hello!";
    30. sprintf(s6, "i=%i, f1=%f, f2=%.2f s=%s", i, f, f, str);
    31. std::cout << "sprintf:" << s6 << std::endl;
    • C++ 字符串 (std::string)

    初始化字符串

    1. #include
    2. // std::string初始化
    3. std::string s1("1111"); // 直接给定内容
    4. std::string s2 = "abcd"; // 直接给定内容
    5. std::string s3(3, 'b'); // 给定3个'b'='bbb'
    6. std::string s4(s3, 2); // 从第2个取到最后='11abcd'
    7. std::string s5(s3, 2, 4); // 从第2个取4个=11ab
    8. std::cout << "s1:" << s1 << std::endl;
    9. std::cout << "s2:" << s2 << std::endl;
    10. std::cout << "s3:" << s3 << std::endl;
    11. std::cout << "s4:" << s4 << std::endl;
    12. std::cout << "s5:" << s5 << std::endl;

    重载+, +=, =

    1. #include
    2. const std::string s1("1111");
    3. const std::string s2("2222");
    4. std::string s3 = s1 + s2; // 11112222
    5. std::cout << s1 << " + " << s2 << " = " << s3 << std::endl;
    6. s3 += "abcd"; // 11112222abcd
    7. std::cout << "(s3 += 'abcd') = " << s3 << std::endl;

    字符串比较,和逻辑运算符:

    1. #include
    2. const std::string s1("1111");
    3. const std::string s2("2222");
    4. // 比较字符串:(s1s2)=1
    5. const int cmp = s1.compare(s2);
    6. std::cout << s1 << " comapre " << s2 << " = " << cmp << std::endl;
    7. // 五个逻辑运算:>,>=,<,<=,==
    8. // 例子如下:
    9. if (s1 == s2) {
    10. // 判断s1==s2
    11. std::cout << s1 << " == " << s2 << std::endl;
    12. }
    13. else if (s1 > s2) {
    14. // 判断s1>s2
    15. std::cout << s1 << " > " << s2 << std::endl;
    16. }
    17. else if (s1 < s2) {
    18. // 判断s1
    19. std::cout << s1 << " < " << s2 << std::endl;
    20. }
    • std::string 常用函数例子

    1. #include
    2. const std::string s1("1111");
    3. const std::string s2("222211113333aaaa456");
    4. // 计算字符长度
    5. size_t len1 = s1.length(); // 或s2.size()
    6. std::cout << "s1:" << s1 << ", length:" << len1 << std::endl;
    7. // 查找字符
    8. const size_t findIndex1 = s2.find('1'); // 查找子字符,找不到返回 std::string::npos
    9. std::cout << s2 << " find char " << '1' << " = " << findIndex1 << std::endl;
    10. // 查找子字符串
    11. const size_t findIndex2 = s2.find(s1, 2); // 从第2位开始查找子字符串,找不到返回 std::string::npos
    12. std::cout << s2 << " find string " << s1 << " = " << findIndex2 << std::endl;
    13. const size_t findIndex3 = s2.rfind("3333"); // 从右到左开始查找子字符串,找不到返回 std::string::npos
    14. std::cout << s2 << " rfind string '3333' " << " = " << findIndex3 << std::endl;
    15. // 字符串拼接
    16. std::string s5 = s1 + s2;
    17. std::cout << s1 << " + " << s2 << " = " << s5 << std::endl;
    18. s5.append("ABCD");
    19. std::cout << "(s5.append('ABCD') = " << s5 << std::endl;
    20. // 截取子字符串
    21. const std::string s6 = s2.substr(2); // 从第2个字符开始,取后面所有字符=2211113333aaaa456
    22. std::cout << "s6:" << s6 << std::endl;
    23. std::string s7 = s2.substr(2, 7); // 从第2个字符开始,取后面7个字符=2211113
    24. std::cout << "s7:" << s7 << std::endl;
    25. s7.clear(); // 清空字符串
    26. const bool s7IsEmpty = s7.empty(); // 判断是否空字符串
    27. std::cout << "s7 is empty:" << s7IsEmpty << std::endl;
    28. // 插入字符串
    29. s7 = "123456";
    30. s7.insert(2, "abcd"); // 在第2位插入abcd=12abcd3456
    31. std::cout << "s7:" << s7 << std::endl;
    32. // 替换字符串
    33. s7.replace(2, 5, "ABCD"); // 在第2位连续5个字符替换成ABCD=12ABCD456
    34. std::cout << "s7:" << s7 << std::endl;
    35. // 截取单独字符
    36. const char c1 = s7.at(2); // 取第2个字符=A
    37. std::cout << s7 << " at(2) = " << c1 << std::endl;
    • 字符串字符排序

    字符串排序是从 0 开始计算,即字符串 "abcd",第 0 位是 'a',第 1 位是 'b',依此类推;(实际上,所有数组相关序号都是从 0 开始排序)

    • 字符串结束符标识 (\0)

    • std::wstring 宽字符串类

    使用方法跟 std::string 一样,参照使用即可

    3 注意事项:

    • 使用 C 语言字符串 (char s[N]),需要注意字符串 N 的长度,避免复制超过 N 长度字符串,发生访问越界导致程序异常问题
    • 使用 std::string::at(INDEX) 函数,也需要避免 INDEX 超过字符串长度,否则也会程序异常问题

    4 课后练习:

    • 练习1:用 while 循环生成 'a'~'z' 26个字符的 s1 字符串,打印到屏幕上
    • 练习2:把全部小字的字符串 s1,转成大字的 'A'~'Z' s2字符串,并打印字符串到屏幕上
    • 练习3:分别从第 10 位到第 20 位,每次取出 5 个字符并打印出结果

      附录:在线视频课程

    进入视频号学习本文配套视频课程。

    -【End】-

    哈喽,大家好!我是喜欢coding的小二,一枚“靓仔又不掉头发”的C++开发大头兵;欢迎围观公众号(20YC编程),定期会分享一些技术开发经验、行业资讯、业界动态等。期待您的关注,一起交流学习进步。

    #下载示例源码和开发工具,请进入公众号首页,点击(发消息)最下方的(资源下载)菜单即可获取。

    喜欢本文章,记得点赞、分享、关注哦~

  • 相关阅读:
    UTF-8字符串操作方法
    Nginx的日志格式
    总结七大排序算法
    【Go语言】切片的扩容
    laravel-admin的3个开发细节调整
    力扣解法汇总1175-质数排列
    练[GYCTF2020]EasyThinking
    浅谈微机综合自动化系统在化工企业变电站中应用
    整合Mybatis、Servlet、Mysql、Axios、Filter、Session写一个入门级项目:非常适合初接触JavaWeb的小白白来进阶
    R语言处理数据——替换数据中某元素
  • 原文地址:https://blog.csdn.net/yanghz/article/details/133945014