19----C/C++之加密解密带空格字符串的读入

news2024/10/6 16:30:55
  • 本文主要通过一道题目来讲解C语言相关的简单加密和解密,以及如何读入带有空格的字符串

小试牛刀

  • 题目描述

    在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密。我们给出一种最简单的加密方法,对给定的一个字符串,把其中从 a∼y,A∼Y 的字母用其后继字母替代,把 z 和 Z用 a 和 A 替代,其他非字母字符不变。请根据该加密规则将输入的密码进行解密。

提示:这里需要进行解密操作,而不是加密。

  • 输入格式

      一行,加密后的字符串,长度不多于 10000 个字符。
    
  • 输出格式

      一行,将密码解密后的字符串。
    
  • 输入输出样例

输入

 Ifmmp !  Ipx  bsf  zpv! 

输出

 Hello !  How  are  you! 

根据题目的描述,我们的任务就是解密,即每个字母都由其前驱代替,a由z代替,A由Z代替,其余字符不变。


下面我们尝试写出代码:

  1. 方法一: 利用while()循环,结合getchar()逐个读入并解密赋值,当读到'\n'时自动结束读入,再输出即可。
#include<iostream>

using namespace std;

char s[10001];
char c;
int i;
int main(void)
{
	while ((c = getchar()) != -1)//这里可以写!=-1 或者!=EOF  ,不能写!='\n';
	{
		if (c == 'a')s[i] = 'z';
		else if (c == 'A')s[i] = 'Z';
		else if ((c > 'A' && c <= 'Z') || (c > 'a' && c <= 'z')) s[i] = (char)((int)c - 1);
		else s[i] = c;
		i++;
	}
	for (int j = 0; j < i; j++)
	{
		cout << s[j];
	}
	return 0;
}
  • 这个方法的好处在于可以设置特定的终止字符,甚至终止位置,时间复杂度为O(n)。

  1. 方法二:利用fgets()函数直接读入一连串字符(遇到换行符时才停止)。再利用循环进行解密操作,完了输出即可。
#include<iostream>
#include<cstring>
using namespace std;

char s[10005];
char c;
int i;
int main(void)
{
	fgets(s, 10001, stdin);
	for (int i = 0; i < strlen(s); i++)
	{
		c = s[i];
		if (c == 'a')s[i] = 'z';
		else if (c == 'A')s[i] = 'Z';
		else if ((c > 65 && c <= 90) || (c > 97 && c <= 122) )s[i] = (char)((int)c - 1);
		else;

	}
	fputs(s, stdout);
	return 0;
}
  • 这个方法的好处在于可以一次性读入和输出带有空格的长字符串,省去了利用循环带来的时间消耗,时间复杂度为O(n)。

  1. 方法三:利用getline()函数进行指定位数输入,大多数情况下用于一整行(段)输入;strlen()函数用于获取字符串长度,然后边判断边输出。
#include<bits/stdc++.h>//万能头文件
using namespace std;
char s[10001]; //定义字符串。
int n; //字符串长度。
int main(void)
{
	cin.getline(s,10000);
    //输入字符串,因为有空格,所以不能用cin<<s。
    //最多10000位,末位自动为'\0',所以输入10000位,输入不够10000位就自动停止。
	n=strlen(s); //非空字符串长度。
	for(int i=0;i<n;i++) //输入时是从第0位到第n-1位。
	{
		if((s[i]>'a'&&s[i]<='z')||(s[i]>'A'&&s[i]<='Z'))
			s[i]--;
        //把b-z和B-Z替换成前一个字母。
		else if(s[i]=='a')
			s[i]='z';
        //把a替换成z。
		else if(s[i]=='A')
			s[i]='Z';
        //把A替换成Z。
        else;
        //其余字符不变
		cout<<s[i]; //边改边输出,减少时间消耗
	}
	return 0;
}
  • 这个方法和方法二有些类似,时间复杂度也为O(n)。

  1. 方法四:先利用getline(cin,s)输入带空格的字符串,(对于字符串来说,普通的 cin 只能读取没有空格的字符串;)再循环解密输出即可。
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
string s;//这里用STL的字符串
int main(void) {
	getline(cin, s);//输入字符串
		for (int i = 0; i < s.length(); i++) {
			
			if ((s[i] > 'a' && s[i] <= 'z') || (s[i] > 'A' && s[i] <= 'Z'))
				s[i]--;
			//把b-z和B-Z替换成前一个字母。
			else if (s[i] == 'a')
				s[i] = 'z';
			//把a替换成z。
			else if (s[i] == 'A')
				s[i] = 'Z';
			//把A替换成Z。
			else;
		}
	cout << s;//直接输出
	return 0;
}

  • 此方法和方法二,方法三类似,只是输入字符串方式不一样罢了,时间复杂度也为O(n)。

要点剖析:

  • 下面我们来看看怎么读入带有空格的字符串,分别从C语言和C++的角度来讲解。

一、C语言中读入带有空格字符串的方法:

  1. 使用scanf函数:scanf函数默认以空格作为分隔符,可以使用%s格式化指示符来读取字符串,但它会在遇到空格时停止读取。为了读取带有空格的字符串,可以使用%[^\n]格式化指示符,它会读取除换行符外的所有字符。
#include <stdio.h>

int main() {
    char str[100];
    printf("Enter a string: ");
    scanf("%[^\n]", str);
    printf("You entered: %s\n", str);
    return 0;
}

  1. 使用fgets函数:fgets函数可以读取一行字符串,包括空格。它接受三个参数:要读取的字符串的地址、最大字符数和文件指针(可以是stdin)。注意,fgets函数会将换行符也读入字符串中。
#include <stdio.h>

int main() {
    char str[100];
    printf("Enter a string: ");
    fgets(str, sizeof(str), stdin);
    printf("You entered: %s\n", str);
    return 0;
}

由于gets()函数的不安全性,我们这里使用fgets()


  1. 使用getchar函数:getchar函数可以逐个字符读取输入。可以使用一个循环来读取字符,直到遇到换行符或达到最大字符数。
#include <stdio.h>

int main() {
    char str[100];
    printf("Enter a string: ");
    int i = 0;
    char c;
    while ((c = getchar()) != '\n' && i < sizeof(str) - 1) {
        str[i++] = c;
    }
    str[i] = '\0';
    printf("You entered: %s\n", str);
    return 0;
}

  • 这些方法可以读取带有空格的字符串,但需要注意输入的长度限制和处理换行符的方式。选择合适的方法取决于具体的需求和输入格式。

二、C++中读入带有空格字符串的方法:

  1. 使用cingetline()cin是C++的输入流对象,可以使用>>操作符来读取字符串。默认情况下,cin会以空格作为分隔符,因此会在遇到空格时停止读取。为了读取带有空格的字符串,可以使用getline函数。getline函数可以从输入流中读取一行字符串,包括空格。它接受两个参数:要读取的字符串对象和输入流对象(可以是cin)。注意,getline函数会将换行符也读入字符串中。
#include <iostream>
#include <string>

int main() {
    std::string str;
    std::cout << "Enter a string: ";
    std::getline(std::cin, str);
    std::cout << "You entered: " << str << std::endl;
    return 0;
}

  1. 在C++中,还有一种方法可以读取带有空格的字符串,即使用stringstreamstringstream是C++标准库中的一个类,可以将字符串视为流进行处理。通过将输入的字符串存储在stringstream对象中,可以使用>>操作符来读取带有空格的字符串。

以下是使用stringstream读取带有空格的字符串的示例代码:

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string input;
    std::cout << "Enter a string: ";
    std::getline(std::cin, input);

    std::stringstream ss(input);
    std::string str;
    while (ss >> str) {
        std::cout << "Word: " << str << std::endl;
    }

    return 0;
}
  • 在上述代码中,首先使用getline函数读取一行输入字符串。然后,将该字符串存储在stringstream对象ss中。使用>>操作符从ss中逐个读取字符串,每次读取一个单词,并将其打印出来。

  • 这种方法适用于需要逐个处理输入字符串中的单词的场景。可以根据具体需求对读取到的字符串进行进一步处理。


  1. 还有一种方法,也是使用getline()函数。getline()函数可以动态分配内存,并一次性读取整行输入,并将其存储在指定的字符数组中。

以下是使用getline()函数读取带有空格的字符串的示例代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *str = NULL;
    size_t bufsize = 0;
    printf("Enter a string: ");
    getline(&str, &bufsize, stdin);
    printf("You entered: %s", str);
    free(str);
    return 0;
}
  • 在上述代码中,首先定义一个字符指针str,并将其初始化为NULL。然后,使用getline()函数来读取整行输入,并将其存储在str指针指向的内存中。getline()函数会自动分配足够的内存来存储输入的字符串,并将字符串的长度存储在bufsize变量中。

  • 需要注意的是,使用getline()函数需要包含头文件<stdlib.h>,并且在使用完之后需要调用free()函数来释放动态分配的内存,以防止内存泄漏。


三、总结与思考:

  • 本次我们学习了如何输入带有空格的字符串,且分别从C语言和C++的角度进行了讲解,利用fgets(),getline(),getchar()等都是不错的方法。相信通过本篇文章的学习,你对这方面的题目将不再存有疑问。

在这里插入图片描述

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

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

相关文章

【爬虫练习之glidedsky】爬虫-基础1

题目 链接 爬虫的目标很简单&#xff0c;就是拿到想要的数据。 这里有一个网站&#xff0c;里面有一些数字。把这些数字的总和&#xff0c;输入到答案框里面&#xff0c;即可通过本关。 思路 找到调用接口 分析response 代码实现 import re import requestsurl http://www.…

冠达管理:印花税是什么意思?港股取消印花税是利好还是利空?

在股票市场上&#xff0c;投资者买卖股票需求交纳必定的手续费用&#xff0c;比如&#xff0c;佣钱费用、过户费用、印花税等等&#xff0c;那么&#xff0c;印花税是什么意思&#xff1f;港股撤销印花税是利好仍是利空&#xff1f;下面冠达管理为大家准备了相关内容&#xff0…

QT处理日志文件

由于实际生产需要&#xff0c;软件系统的运行&#xff0c;会产生大量的日志文件&#xff0c;有时候一天就能产生超过百万条log记录&#xff0c;那么为了能够处理日志文件&#xff0c;查询并且找到我们想要的报错信息&#xff0c;因此不得不考虑怎么实现&#xff0c;打开大日志文…

excel日期函数篇2

1、DATE(year,month,day)&#xff1a;根据年、月、日三个数值返回其表示的日期 2、DATEVALUE(date_text)&#xff1a;返回由文本字符串表示的日期的十进制数字 处理时间的时候&#xff0c;如果得到的是字符串格式&#xff0c;要将其转换为日期进行相关操作。excel函数里是使用文…

MinGW编译运行报错RTTI symbol not found for class ‘XXX‘

最近在调试程序时莫名的出现图中报错&#xff1a; 还遇到过for class QObject&#xff0c;在此记录一下&#xff0c;排查后发现&#xff0c;原因都是有资源被重复释放导致的。

intelij idea 2023 创建java web项目

1.点击New Project 2.创建项目名称为helloweb &#xff0c;jdk版本这里使用8&#xff0c;更高版本也不影响工程创建 点击create 3.新建的工程是空的&#xff0c;点击File-> Project Structure 4.点击Modules 5.点击加号&#xff0c;然后键盘输入web可以搜索到web模块&…

69 # 强制缓存的配置

强制缓存 强制缓存&#xff1a;以后的请求都不需要访问服务器&#xff0c;状态码为 200协商缓存&#xff1a;每次都判断一下&#xff0c;告诉是否需要找缓存&#xff0c;状态码为 304 默认强制缓存&#xff0c;不缓存首页&#xff08;如果已经断网&#xff0c;那这个页面应该…

Python三行代码实现json转Excel

最近重保&#xff0c;经常需要通过Excel上报威胁事件。安全设备的告警很多都是json格式的&#xff0c;就需要将json转成Excel。 用Python将json转成excel也就三行代码的事&#xff0c;先将json串导入形成字典对象&#xff0c;再通过pandas转成DataFrame直接输出excel。 实现如下…

windows电脑系统自带的画图工具如何实现自由拼图

1.首先选中你要拼接的第一张图片&#xff0c;右键选着编辑&#xff0c;会自动打开自带的画图工具 然后就是打开第一张图片&#xff0c;如下图所示 接着就是将画布托大&#xff0c;如下图所示。 然后点击选择&#xff0c;选择下面的空白区域&#xff0c;选着区域的范围要比准备拼…

智能楼宇综合布线实训室建设方案

一、楼宇智能综合布线实训室方案概述 楼宇智能综合布线实训室方案旨在为学生提供一个真实的学习和实践环境&#xff0c;以培养他们在楼宇智能综合布线领域的实际操作能力和技能。以下是一个概述&#xff1a; 1. 培养目标&#xff1a;培养学生在楼宇智能综合布线方面的综合能力…

耳朵小戴哪种耳机,佩戴舒适度最好的骨传导蓝牙耳机分享

亲爱的小伙伴们&#xff01;这些精心挑选的骨传导耳机绝对能给你带来全新的耳机体验。告别堵塞的耳道和细菌的困扰&#xff0c;让音乐与你完美融合&#xff01;不管你是运动爱好者、音乐发烧友还是生活达人&#xff0c;这些骨传导耳机都能满足你的需求。快行动起来&#xff0c;…

Freertos学习

一、概念 实时操作系统&#xff0c;要求一个高的实时性&#xff0c;就不是像在一个死循环中放俩函数了。而是创建俩任务&#xff0c;也叫做俩进程&#xff0c;高速的轮流执行&#xff0c;提高实时性。 二、创建任务

低代码开发ERP:精打细算,聚焦核心投入

企业数字化转型已经成为现代商业环境中的一项关键任务。如今&#xff0c;企业面临着日益激烈的竞争和不断变化的市场需求。在这样的背景下&#xff0c;数字化转型不仅是企业生存的必然选择&#xff0c;也是取得竞争优势和实现可持续发展的关键因素。 在数字化转型的过程中&…

前端对文件转换处理的一些常用方法

文章目录 0&#xff0c;前言1&#xff0c;将图片的url网络链接(http://) 转为base64格式2&#xff0c;将base64的图片数据转换为file文件3&#xff0c;将以base64的图片数据转换为Blob4&#xff0c;将file文件转化为base645&#xff0c;将file文件转换为Blob6&#xff0c;获取文…

postmarketOS

主步骤 #以下全程插入usb线 fastboot devices fastboot getvar all fastboot erase userdata fastboot erase system fastboot erase cachepmbootstrap init pmbootstrap installpmbootstrap flasher flash_rootfs --partition userdata pmbootstrap flasher flash_kernel…

盘点哪些好用的开放式耳机有哪些?开放式蓝牙耳机排行榜推荐

​你是否厌倦了传统耳机的束缚&#xff1f;是否渴望一种更为自由的听音体验&#xff1f;开放式耳机&#xff0c;将为你打开一扇全新的听觉大门。开放式耳机采用不入耳设计&#xff0c;让你在享受音乐的同时&#xff0c;保持对外界的感知&#xff0c;随时随地&#xff0c;尽享自…

图片展示 JAVA

利用Java中提供的 ImageIcon类和JLabel类加载与显示电脑路径中的图片&#xff0c;并最终展示在JFrame类窗口中。 代码&#xff1a; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel;public class Main extends JFrame {//继承父类Jframe…

智能画笔:如何利用AI绘画API打造独特的创作风格

在当今数字化时代&#xff0c;人工智能的迅猛发展正深刻地影响着各个领域&#xff0c;艺术创作也不例外。AI绘画 API 作为一种创新的工具&#xff0c;为艺术家提供了独特的机会&#xff0c;使他们能够在创作过程中借助人工智能技术&#xff0c;打造出独具个性的创作风格。本文将…

Linux系统中lib64文件夹下包含:动态链接库,静态链接库,内核模块等

lib64 目录对系统稳定运行有重要作用。 目录 lib64文件动态链接库静态链接库内核模块 lib64文件 lib64 文件夹存放主要是可被程序直接加载并使用的 64 位代码模块,包括动态库、静态库、内核模块等,这些文件对程序运行都至关重要。 在 Linux 系统中,lib64 文件夹通常用于存放…

阿里巴巴面试高频题:JVM内存模型通俗解释!

大家好&#xff0c;我是你们的小米&#xff0c;今天我要和大家一起来探讨一个热门话题——JVM内存模型&#xff01;作为计算机科班出身的小米&#xff0c;一直对技术充满热情&#xff0c;喜欢和大家分享各种有趣的知识。最近在准备阿里巴巴的面试时&#xff0c;遇到了一个非常有…