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

news2024/12/23 6:00:26

第 4 章 字符串

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

4.1 字符串内容详解

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

示例结果 11

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

示例结果

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

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

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

示例结果

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

示例结果

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

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

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

示例结果

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

示例结果

think

4.2 特殊乘法

题目描述

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

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

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

代码表示
#include <bits/stdc++.h>
using namespace std;

int main() {
  string str1, str2;//定义两个字符串 
  while (cin >> str1 >> str2) //不断的输入字符串 
  {
  int answer = 0;
  for (int i = 0; i < str1.size(); ++i)
   {
    for (int j = 0; j < str2.size(); ++j) 
	 {
       answer += (str1[i] - '0') * (str2[j] - '0');
     }
    }
   printf("%d\n", answer);
  }
 return 0;
}
心得体会

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个字符

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

代码表示
#include <bits/stdc++.h>
using namespace std;

int main() {
    string str;
    while (getline(cin, str)) {
        for (int i = 0; i < str.size(); ++i) 
		{
            if (str[i] == 'z' || str[i] == 'Z') 
			{
                str[i] -= 25;
            } 
			else if (('A' <= str[i] && str[i] <= 'Y') || 
			             ('a' <= str[i] && str[i] <= 'y')) 
			{
                str[i]++;
            }
        }
        cout << str << endl;
    }
    return 0;
}
心得体会

相当于是有两个范围,一个节点是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"。

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

代码表示:
#include <iostream>
using namespace std;

int main() {
    string str;
    while (getline(cin, str)) {
        if (str == "ENDOFINPUT") {
            break;
        }
        getline(cin, str);
        for (int i = 0; i < str.size(); ++i) {
            if ('A' <= str[i] && str[i] <= 'Z')//检查是不是A到Z的 
			{
                str[i] = (str[i] - 'A' - 5 + 26) % 26 + 'A';
            }
        }
        cout << str << endl;
        getline(cin, str);
    }
    return 0;
}
心得体会

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,我们可以逐行读取输入,直到遇到文件结束符或输入流关闭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1501429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3月求职黄金期!如何打造自己的岗位优势?这6大分析维度很重要!

三月份&#xff0c;又到了一年的求职黄金期。在今年这场求职大队中&#xff0c;想要找到一份满意的工作&#xff0c;你不仅要学会打造一份高质量简历&#xff0c;还要懂得完美应对HR的各项提问。 一、岗位能力的6大分析维度 虽说是求职黄金期&#xff0c;但找工作也不是随便找…

一键查看:大厂网站都用了啥技术栈,有图有真相。

本次我们采用Wappalyzer插件来看下国内大厂的网站都采用了什么技术架构&#xff0c;文章最后由Wappalyzer的安装方法。 今日头条网站 淘宝网站 哔哩哔哩 京东商城 花瓣网 CSDN 国务院 网易 58同城 腾讯网 如何安装Wappalyzer 用Edge浏览器即可

c++的STL(2)-- vector容器

目录 1. 默认构造 代码: 相关知识点: 2. 有参构造函数 以及 使用{}初始化对象 代码: 相关知识点: 3. vector容器在尾部添加和删除元素 代码: 使用push_back()和pop_back()进行尾部元素的添加和删除 相关知识点: 代码: 使用emplace_back在尾部添…

Spring Boot中SQL语句报错

报错原因&#xff1a; You have an error in your SQL syntax 你的SQL语句出现错误 报错位置&#xff1a; check the manual that corresponds to your MySQL server version for the right syntax to use near :/sql/schema.sql.t_film at line 1 在:/sql/schema.sql附近使用…

Linux系统——Haproxy高性能负载均衡软件

目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…

md5绕过

文章目录 \\和\\\md5数组绕过科学计数法绕过双md加密md5碰撞Hash长度攻击 下面会以同一道题给大家演示&#xff1a; (题目来源与nssctf) 和 在php代码中我们会看到和&#xff0c;虽然两个都是表示相等&#xff0c;但是在细节上会有所部区别 &#xff1a;是弱比较&#xff0c;只…

Java基础面试题(day 01)

&#x1f4d1;前言 本文主要是【Java】——Java基础面试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

httprunner参数化

1. 示例 引入对应的Parameters 1.1. CSV参数 from httprunner import HttpRunner, Config, Step, RunRequest, Parameters pytest.mark.parametrize("param", Parameters({"mobile_phone-pwd": "${P(csv_data/mobile_phone-pwd.csv)}"}))def …

C#中实现接口的一些小知识(C#用abstract或virtual来实现接口成员)

文章目录 不可用的修饰可用的修饰非抽象类实现接口抽象类实现接口抽象类与接口方法同名时一同实现 不可用的修饰 在C#中实现接口时&#xff0c;我们不能直接使用static或const来实现接口成员&#xff0c;因为接口中的成员默认都是实例成员&#xff0c;并且它们表示一种契约&am…

【SpringMVC】快速体验 SpringMVC接收数据 第一期

文章目录 一、SpringMVC 介绍1.1 主要作用1.2 核心组件和调用流程理解 二、快速体验三、SpringMVC接收数据3.1 访问路径设置3.1.1 精准路径匹配3.1.2 模糊路径匹配3.1.3 类和方法级别区别3.1.4 附带请求方式限制3.1.5 进阶注解 与 常见配置问题 3.2 接收参数&#xff08;重点&a…

C++ 智能指针深度剖析

文章目录 1. 前言2. 为什么需要智能指针&#xff1f;3. 内存泄漏3.1 内存泄漏的概念及危害3.2 内存泄漏的分类3.3 如何检测内存泄漏3.4 如何避免内存泄漏 4. 智能指针的使用及原理4.1 RAII思想4.2 智能指针的原理4.3 C智能指针发展历史4.4 std::auto_ptr4.5 std::unique_ptr4.6…

计算机组成原理之机器:存储器之辅助存储器

计算机组成原理之机器&#xff1a;存储器之辅助存储器 笔记来源&#xff1a;哈尔滨工业大学计算机组成原理&#xff08;哈工大刘宏伟&#xff09; Chapter3&#xff1a;存储器之辅助存储器 3.1 概述 3.2 磁记录原理 通不同方向电流时磁化方向不同&#xff0c;由此区分写入…

vue 使用谷歌地图 @googlemaps/js-api-loader 进行模糊搜索

<template><div class"map"><div class"mapLeftStyle"><el-inputv-model"input"placeholder"请输入内容"class"controls"input"chnageinput"><i slot"prefix" class"e…

2007-2022年上市公司迪博内部控制评价缺陷数量数据

2007-2022年上市公司迪博内部控制评价缺陷数量数据 1、时间&#xff1a;2007-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、是否存在财报内控重大缺陷、财报内控重大缺陷数量、是否存在财报内控重要缺陷、财报内…

Linux第73步_学习Linux设备树和“OF函数”

掌握设备树是 Linux驱动开发人员必备的技能&#xff01; 1、了解设备树文件 在3.x版本以前的Linux内核源码中&#xff0c;存在大量的“arc/arm/mach-xxx”和“arc/arm/plat-xxx”文件夹&#xff0c;里面很多个“.c”和“.h”文件&#xff0c;它们用来描述设备信息。而现在的A…

使用Portainer让测试环境搭建飞起来

Docker的用处不多加赘述&#xff0c;Docker目前有以下应用场景&#xff1a; 测试&#xff1a;Docker很适合用于测试发布&#xff0c;将 Docker 封装后可以直接提供给测试人员进行运行&#xff0c;不再需要测试人员与运维、开发进行配合&#xff0c;进行环境搭建与部署。 测试…

【考研数学】李林《880》vs 李永乐《660》完美使用搭配

没有说谁一定好&#xff0c;只有适不适合自身情况&#xff0c;针对自身弱点选择性价比才最高。 两者侧重点不同&#xff0c;660适合强化前期&#xff0c;弥补基础的不足&#xff0c;880适合强化后期&#xff0c;题型全面&#xff0c;提高我们对综合运用知识的能力。 选择习题…

动手学深度学习PyTorch版

基本的数据操作 import torch # 创建一个行向量&#xff0c;默认为从0开始的12个整数 # n维数组也称为张量 x torch.arange(12) x # 张量的形状 x.shape# 张量的大小,张量所有元素的个数 x.numel()#修改张量的形状 x x.reshape(3,4)#生成形状为3*4的两个向量&#xff0c;向…

C#实现归并排序算法

C#实现归并排序算法 以下是 C# 中的归并排序算法实现示例&#xff1a; using System;class MergeSortAlgorithm {// 合并两个子数组static void Merge(int[] arr, int left, int mid, int right){// 计算左子数组和右子数组的长度int n1 mid - left 1;int n2 right - mid;/…

力扣--滑动窗口438.找到字符串中所有字母异位词

思路分析&#xff1a; 使用两个数组snum和pnum分别记录字符串s和p中各字符出现的次数。遍历字符串p&#xff0c;统计其中各字符的出现次数&#xff0c;存储在pnum数组中。初始化snum数组&#xff0c;统计s的前m-1个字符的出现次数。从第m个字符开始遍历s&#xff0c;通过滑动窗…