• 王道机试C++第 4 章 字符串:字符串内容详解及三个小程序 Day29


    第 4 章 字符串

    本章介绍一种基础数据类型——字符串,并且介绍一些字符串处理的方法及字符串匹配的方法。虽然字符串的内容非常基础,但是十分重要。希望读者能够好好学习本章的内容,为此后的学习打下良好的基础。

    4.1 字符串内容详解

    由于 C 语言不提供字符串这一基本类型,因此通常需要使用字符数组来代替字符串,因此操作起来会很不方便。好在 C++ 提供了字符串( string )这种基本数据类型,它可以很方便地对字符串进行各种操作。对大部分读者而言,并不需要关心 string 内部的实现细节,学会使用即可。
    1string 的定义
    为了使用 string 标准模板,应在代码中添加头文件 #include 。定义一个字符串的方式和定义其他基本数据类型的方式相同,如 string str ,其中 str 是定义的字符串的名字:string str;
    2string 的初始化
    可以直接给字符串变量赋值,如 string str = “hello”; string str = "hello world"; cout << str << endl;
    示例结果 hello world
    3string 的长度
    返回当前字符串长度的函数有 str. size() length() ,二者功能基本相同。
    1. string str = "hello world";
    2. int n = str.size();
    3. printf("%d\n", n);

    示例结果 11

    4string 元素的访问
    ① 可以像数组那样通过元素下标进行访问,访问字符str[ i ],下标从 0 size()-1
    1. string str = "hello world";
    2. for (int i = 0; i < str.size(); ++i) {
    3. printf("%c ", str[i]);
    4. }
    5. printf("\n");
    6. printf("the 7th element of str is: %d\n", str[6]);

    示例结果

    h e l l o w o r l d
    w
    ② 可以通过迭代器进行访问,迭代器类似于指针。
    1. string str = "hello world";
    2. for (string::iterator it = str.begin(); it != str.end(); ++it)
    3. {
    4. printf("%c ", *it);
    5. }
    6. printf("\n");

    示例结果   h e l l o w o r l d

    5string 中的元素操作
    string 中常用的元素操作包括在任意位置插入元素的 insert() 、在任意位置删除元素的 str.erase()和将字符串清空的 str. clear()
    1. string str = "hello world";
    2. str.insert(str.size(), " end world");
    3. cout << str << endl;
    4. str.erase(0, 12);
    5. cout << str << endl;
    6. str.insert(0, "how to ");
    7. cout << str << endl;
    8. str.erase(7);
    9. cout << str << endl;
    10. str.clear();
    11. cout << str << endl;

    示例结果

    hello world end world
    end world
    how to end world
    how to
    6string 的运算符
    string 可像数字一样进行运算,但不是进行加减乘除这样的数字逻辑运算,而是可以将两个或多个字符串拼接成为一个更长的字符串。连接字符串和字符串或字符的运算符有“+” 和 “+=”。
    1. string str1 = "to be";
    2. string str2 = "not to be";
    3. string str3 = "that is a question";
    4. string str = str1 + ", ";
    5. //"to be , "
    6. str = str + str2 + ';';
    7. //"to be , not to be; "
    8. str += str3;
    9. cout << str << endl;

    示例结果

    to be, or not to be; that is a question

    也可以按照字典序进行大小比较,比较运算符有<><=>=,判断两个字符串是否相等的运算符有==!=

    1. string str1 = "abc";
    2. string str2 = "abcd";
    3. string str3 = "bc";
    4. string str4 = "abcd"
    5. if (str1 <= str2) {
    6. printf("str1 <= str2\n");
    7. }
    8. if (str2 < str3) {
    9. printf("str2 < str3\n");
    10. }
    11. if (str3 > str1) {
    12. printf("str3 > str1\n");
    13. }
    14. if (str1 != str3) {
    15. printf("str1 != str3\n");
    16. }
    17. if (str2 == str4) {
    18. printf("str2 == str4\n");
    19. }
    示例结果
    str1 <= str2
    str2 < str3
    str3 > str1
    str1 != str3
    str2 == str4
    7string 的常用函数
    1 、在字符串中寻找特定字符或字符串的函数是 find() 。若函数找到相应的字符或字符串
    则返回对应内容的下标,若找不到返回 string::npos
    1. string str = "hello world";
    2. int found = str.find("world"); //找字符串
    3. if (found != string::npos)
    4. {
    5. printf("'world' found at: %d\n", found);
    6. }
    7. found = str.find('l');
    8. if (found != string::npos) {
    9. //找字符
    10. printf("'l' found at: %d\n", found);
    11. }
    12. found = str.find('.');
    13. if (found == string::npos) {
    14. printf("'.' not founded");
    15. }

    示例结果

    'world' found at: 6
    'l' found at 2
    '.' not founded
    2 、返回字符串的子串的函数是 substr()
    1. string str1 = "We think in generalities, but we live in details.";
    2. string str2 = str1.substr(3,5);
    3. cout << str2 << endl;

    示例结果

    think

    4.2 特殊乘法

    题目描述

    写个算法,对2个小于1000000000的输入,求结果。 特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5

    输入描述:两个小于1000000000的数

    输出描述:输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。

    代码表示
    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int main() {
    4. string str1, str2;//定义两个字符串
    5. while (cin >> str1 >> str2) //不断的输入字符串
    6. {
    7. int answer = 0;
    8. for (int i = 0; i < str1.size(); ++i)
    9. {
    10. for (int j = 0; j < str2.size(); ++j)
    11. {
    12. answer += (str1[i] - '0') * (str2[j] - '0');
    13. }
    14. }
    15. printf("%d\n", answer);
    16. }
    17. return 0;
    18. }
    心得体会

    str1[i]str2[j] 是分别表示第一个字符串和第二个字符串中第 i 个字符和第 j 个字符。

    str1[i] - '0'str2[j] - '0' 是将字符转换为对应的数字。在 ASCII 编码中,数字字符的编码是连续的,所以通过将字符减去字符 '0' 的ASCII编码值,可以得到对应的数字值。

    然后,(str1[i] - '0') * (str2[j] - '0') 是将两个字符转换后的数字进行乘法操作,得到它们的乘积。

    最后,answer += (str1[i] - '0') * (str2[j] - '0') 是将每次计算得到的乘积累加到变量 answer 中。


    密码翻译

    习题描述

    在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,则可得到一个简单的加密字符串。

    输入描述:读取这一行字符串,每个字符串长度小于80个字符

    输出描述:对于每组数据,输出每行字符串的加密字符串。

    代码表示
    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int main() {
    4. string str;
    5. while (getline(cin, str)) {
    6. for (int i = 0; i < str.size(); ++i)
    7. {
    8. if (str[i] == 'z' || str[i] == 'Z')
    9. {
    10. str[i] -= 25;
    11. }
    12. else if (('A' <= str[i] && str[i] <= 'Y') ||
    13. ('a' <= str[i] && str[i] <= 'y'))
    14. {
    15. str[i]++;
    16. }
    17. }
    18. cout << str << endl;
    19. }
    20. return 0;
    21. }
    心得体会

    相当于是有两个范围,一个节点是z和Z的下一个结点是a和A;除了这个特殊的之外,其他的就是从a到y和A到Y的;

    1、在 main 函数中,声明一个字符串变量 str,用于存储从标准输入读取的每一行字符串。

    2、使用 getline(cin, str) 循环读取标准输入的每一行字符串,直到遇到文件结束符或输入流关闭。

    3、在循环中,使用 for 循环遍历字符串 str 中的每个字符。

    4、对于每个字符,首先检查它是否为字母 'z' 或 'Z'。如果是,则将其 ASCII 值减去 25,这相当于将 'z' 变为 'a',或将 'Z' 变为 'A'。这个操作实际上是将字母循环回到字母表的开头。

    5、如果字符不是 'z' 或 'Z',则进一步检查它是否为字母 'A' 到 'Y' 或 'a' 到 'y' 之间的字符。如果是,则将其 ASCII 值加 1,这相当于将字母向后移动一个位置。


    简单密码

    题目描述

    Julius Caesar曾经使用过一种很简单的密码。 对于明文中的每个字符,将它用它字母表中后5位对应的字符来代替,这样就得到了密文。 比如字符A用F来代替。如下是密文和明文中字符的对应关系。 密文 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 明文 V W X Y Z A B C D E F G H I J K L M N O P Q R S T U 你的任务是对给定的密文进行解密得到明文。 你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。

    输入描述:输入中的测试数据不超过100组。每组数据都有如下的形式,而且各组测试数据之间没有空白的行。 一组测试数据包括三部分:

    1.    起始行 - 一行,包括字符串 "START"

    2.    密文 - 一行,给出密文,密文不为空,而且其中的字符数不超过200

    3.    结束行 - 一行,包括字符串 "END" 在最后一组测试数据之后有一行,包括字符串 "ENDOFINPUT"。

    输出描述:对每组数据,都有一行输出,给出密文对应的明文

    代码表示:
    1. #include <iostream>
    2. using namespace std;
    3. int main() {
    4. string str;
    5. while (getline(cin, str)) {
    6. if (str == "ENDOFINPUT") {
    7. break;
    8. }
    9. getline(cin, str);
    10. for (int i = 0; i < str.size(); ++i) {
    11. if ('A' <= str[i] && str[i] <= 'Z')//检查是不是A到Z的
    12. {
    13. str[i] = (str[i] - 'A' - 5 + 26) % 26 + 'A';
    14. }
    15. }
    16. cout << str << endl;
    17. getline(cin, str);
    18. }
    19. return 0;
    20. }
    心得体会

    1、 str[i] = (str[i] - 'A' - 5 + 26) % 26 + 'A';  需仔细观察代码得出

    1)首先,我们将密文字符的 ASCII 值减去大写字母 A 的 ASCII 值,以计算字符相对于 A 的偏移量。这个偏移量表示了字符在字母表中的位置。

    2)然后,我们将偏移量减去 5,以将密文字符向前移动 5 个位置。这是因为题目要求我们将明文中的每个字符用字母表中后 5 位所对应的字符代替。

    3)但是,由于字母表中只有 26 个字母,所以在进行减法运算后,我们可能得到负数或超过 25 的数值。

    4)为了确保结果在 0 到 25 的范围内,我们使用 % 26 运算符。这意味着我们将偏移量对 26 取模,以得到一个在 0 到 25 之间的值。

    5)最后,我们将取模后的偏移量加上大写字母 A 的 ASCII 值,以将其转换回相应的明文字符。这是因为我们之前减去了 A 的 ASCII 值来计算偏移量,现在我们需要将其加回来,以得到正确的明文字符。

    2、getline(cin, str) 是一种输入操作,用于从标准输入流 cin 中读取一行字符串,并将其存储到字符串变量 str 中。

    具体来说,getline 函数会读取从当前位置开始到换行符(包括换行符)之前的所有字符,并将它们存储在指定的字符串变量中。它会自动处理输入流中的换行符,并将其从输入流中移除。

    在这个密码解密算法的代码中,getline(cin, str) 被用于读取输入的每一行字符串。通过循环不断调用 getline,我们可以逐行读取输入,直到遇到文件结束符或输入流关闭。

  • 相关阅读:
    品牌发展,为什么要做好低价管控
    13 媒体存储的封装1
    日常遇到的数据库上的常用排查命令
    华为配置旁挂三层组网直接转发示例
    【数据结构初阶】直接插入排序和希尔排序&链表排序
    批量下载浏览器网页中全部链接的方法
    github参与开源项目并上传修改
    C++编程常见错误及处理
    Elasticsearch Search API说明
    详解​互联网中CI和CD
  • 原文地址:https://blog.csdn.net/weixin_63597914/article/details/136556642