C语言与ASCII码应用之简单加密

news2025/1/10 7:53:05

加密是什么?什么是加密通话?用人话说就是一句有含义的话,经过一定的特殊规则把里面的每个字按照这个规则进行改变,但是这个规则只有你和你想让知道这条信息的人知道

今天我们来用ASCII码编写一个简单加密与解密的程序,用C语言实现秘密通话(当然因为C老登与ASCII码的语言兼容问题,今天咱们写的这个东西只适合英文)也就是凯撒密码

目标

写一个程序,可以把英文句子按照移步加密方式(每个字母往后移几步)加密并且破解,步长由用户指定,仅可以加密A~Z和a~z英文字母以及数字,如果加上步长后超出范围从第一个字母重新开始

思路

这个问题有点复杂,正好画一下算法描述图梳理一下

相关规则 

是个大概 

 运用函数思想,这里需要两个函数

1、检查输入的句子是不是只有英文和阿拉伯数字

2、加密的函数

现在先写一个框架

#include <stdio.h>
#include <string.h>
#define MAX 256

int Foreach(char p[]);
void Encryption(char p[],int n);

int main()
{
    char p[MAX] = "";
    int n = 0;
    printf("Please Enter Sentences(English and Arabic numerals Only):\n");
    fgets(p,MAX,stdin);
    p[strlen(p)-1] = '\0';  //节省内存
    if(Foreach(p) == -1)
    {
        printf("The input is not composed of English sentences and Arabic numerals");
        return 1;   //异常终止
    }
    printf("Please Enter step size: ");
    scanf("%d",&n);
    Encryption(p,n);
    printf("%s",p);
    return 0;
}

int Foreach(char p[])
{

}

void Encryption(char p[],int n)
{

}

ASCII码知识点

c语言里面的字符其实都是默认转化为ASCII码的,都是数字,所以可以加减乘除,数学操作都可以进行(第一次学的时候感觉怪怪的,从来没加减乘除过字母) 

我们先写第一个,顺便修改一下main函数避免奇奇怪怪的输入(推荐标点法,return也是一种标点法)

ctype与isalnum

 isalnum它用于检查给定的字符是否是字母(无论是大写还是小写)或数字(0-9)

isalnum 函数的返回值如下:

  • 如果字符是字母或数字,函数返回非零值(通常是1)。
  • 如果字符不是字母或数字,函数返回零。

具体编写 

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 256

int Foreach(char p[]);
//void Encryption(char p[],int n);

int main()
{
    char p[MAX] = "";
    int n = 0;
    printf("Please Enter Sentences(English and Arabic numerals Only):\n");
    fgets(p,MAX,stdin);
    p[strcspn(p, "\n")] = '\0';  //节省内存
    if(Foreach(p) == -1)
    {
        printf("The input is not composed of English sentences and Arabic numerals");
        return 1;   //异常终止
    }
    else if (Foreach(p) == 0)
    {
        printf("No input entered. Please enter a valid sentence.\n");
        return 1;   // 异常终止
    }
    printf("Please Enter step size: ");
    if (scanf("%d", &n) != 1) 
    {
        // 输入不是一个整数
        printf("Input is not an integer. Exiting program.\n");
        return 1; // 异常终止
    }
    //Encryption(p,n);
    printf("%s",p);
    return 0;
}

int Foreach(char p[])
{
    
    int hasContent = 0; // 标记是否有非空格内容

    if (p == NULL)
    {
        return -1;
    }
    for (int i = 0; p[i] != '\0'; i++)
    {
        if (!isalnum(p[i]) && p[i] != ' ' && p[i] != '.' &&p[i] != ',')
        {
            return -1;
        }
        if (isalnum(p[i])) // 如果字符是字母或数字,则标记有内容
        {
            hasContent = 1;
        }
    }
    if (hasContent == 0) // 如果没有非空格内容,返回0
    {
        return 0;
    }
    return 1; // 输入有效

}

/*
void Encryption(char p[],int n)
{

}*/

接下来就是加密函数

void Encryption(char p[],int n)
{
    int i = 0;
    while(p[i] != '\0')
    {
        if(p[i]>='a' && p[i]<='z')
        {
            p[i] = p[i] + n;
            if(p[i]>'z')
            {
                p[i] = p[i]-'z'+'a'-1;
            }
        }
        if(p[i]>='A' && p[i]<='Z')
        {
            p[i] = p[i] + n;
            if(p[i]>'Z')
            {
                p[i] = p[i]-'Z'+'A'-1;
            }
        }
        if(p[i]>='0' && p[i]<='9')
        {
            p[i] = p[i] + n;
            if(p[i]>'9')
            {
                p[i] = p[i]-'9'+'0'-1;
            }
        }
        i++;
    }
}

写完就是这个

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 256

int Foreach(char p[]);
void Encryption(char p[],int n);

int main()
{
    char p[MAX] = "";
    int n = 0;
    printf("Please Enter Sentences(English and Arabic numerals Only):\n");
    fgets(p,MAX,stdin);
    p[strcspn(p, "\n")] = '\0';  //节省内存
    if(Foreach(p) == -1)
    {
        printf("The input is not composed of English sentences and Arabic numerals");
        return 1;   //异常终止
    }
    else if (Foreach(p) == 0)
    {
        printf("No input entered. Please enter a valid sentence.\n");
        return 1;   // 异常终止
    }
    printf("Please Enter step size: ");
    if (scanf("%d", &n) != 1) 
    {
        // 输入不是一个整数
        printf("Input is not an integer. Exiting program.\n");
        return 1; // 异常终止
    }
    Encryption(p,n);
    printf("%s",p);
    return 0;
}

int Foreach(char p[])
{
    
    int hasContent = 0; // 标记是否有非空格内容

    if (p == NULL)
    {
        return -1;
    }
    for (int i = 0; p[i] != '\0'; i++)
    {
        if (!isalnum(p[i]) && p[i] != ' ' && p[i] != '.' &&p[i] != ',')
        {
            return -1;
        }
        if (isalnum(p[i])) // 如果字符是字母或数字,则标记有内容
        {
            hasContent = 1;
        }
    }
    if (hasContent == 0) // 如果没有非空格内容,返回0
    {
        return 0;
    }
    return 1; // 输入有效

}


void Encryption(char p[],int n)
{
    int i = 0;
    while(p[i] != '\0')
    {
        if(p[i]>='a' && p[i]<='z')
        {
            p[i] = p[i] + n;
            if(p[i]>'z')
            {
                p[i] = p[i]-'z'+'a'-1;
            }
        }
        if(p[i]>='A' && p[i]<='Z')
        {
            p[i] = p[i] + n;
            if(p[i]>'Z')
            {
                p[i] = p[i]-'Z'+'A'-1;
            }
        }
        if(p[i]>='0' && p[i]<='9')
        {
            p[i] = p[i] + n;
            if(p[i]>'9')
            {
                p[i] = p[i]-'9'+'0'-1;
            }
        }
        i++;
    }
}

解码函数

void Decryption(char p[], int n) 
{
    int i = 0;
    while (p[i] != '\0') 
    {
        if (p[i] >= 'a' && p[i] <= 'z') 
        {
            p[i] = p[i] - n;
            if (p[i] < 'a') 
            {
                p[i] = p[i] + 'z' - 'a' + 1;
            }
        } 
        
        if (p[i] >= 'A' && p[i] <= 'Z') 
        {
            p[i] = p[i] - n;
            if (p[i] < 'A') 
            {
                p[i] = p[i] + 'Z' - 'A' + 1;
            }
        }
        if (p[i] >= '0' && p[i] <= '9') 
        {
            p[i] = p[i] - n;
            if (p[i] < '0') 
            {
                p[i] = p[i] + '9' - '0' + 1;
            }
        }
        i++;
    }
}

就是把逻辑反过来而已

运行效果

总结

我们学习了:

1、ASCII码运算(字符本质是数字)

2、isalnum函数

3、标记法(return法)避免错误输入

4、凯撒密码

5、编程流程图

说到密码,我想起了图灵机,最初就是用来解码的

以上均是本人理解,如有不对欢迎各位大佬评论区指出~

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

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

相关文章

国产3D CAD将逐步取代国外软件

在工业软件的关键领域&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件对于制造业的重要性不言而喻。近年来&#xff0c;国产 CAD 的发展态势迅猛&#xff0c;展现出巨大的潜力与机遇&#xff0c;正逐步改变着 CAD 市场长期由国外软件主导的格局。 国产CAD发展现状 …

【Linux网络编程】第二十二弹---深入理解 I/O 多路转接之 epoll:系统调用、工作原理、代码演示及应用场景

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、I/O 多路转接之 epoll 1.1、epoll 初识 1.2、epoll 的相关系统调用 1.2.1、epoll_create 1.2.2、epol…

品牌账号矩阵如何打造?来抄作业

在讲究全域营销的当下&#xff0c;目前企业都在各自搭建品牌矩阵号&#xff0c;以提升自己在不同渠道上的影响力。虽然不同平台之间有诸多细节值得深究&#xff0c;但也不妨碍我们先了解如何搭建品牌矩阵。接下来&#xff0c;就让我们一同来了解下该如何搭建。 一、一个主账号 …

备考蓝桥杯:数据结构概念浅谈

目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量&#xff08;时间复杂度和空间复杂度&#xff09; 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…

scala代码打包配置(maven)

目录 mavenpom.xml打包配置项&#xff08;非完整版&#xff0c;仅含打包的内容< build>&#xff09;pom.xml完整示例&#xff08;需要修改参数&#xff09;效果说明 maven 最主要的方式还是maven进行打包&#xff0c;也好进行配置项的管理 以下为pom文件&#xff08;不要…

用于 EV 牵引电机的先进冷却技术

电动汽车牵引电机的冷却挑战 热管理的重要性 有效的热管理在电动汽车 &#xff08;EV&#xff09; 设计中至关重要&#xff0c;尤其是在牵引电机方面。这些电机将电能转化为机械运动&#xff0c;对车辆的整体性能和效率至关重要。 管理它们的热量至关重要&#xff0c;不仅可以…

课题推荐——基于GPS的无人机自主着陆系统设计

关于“基于GPS的无人机自主着陆系统设计”的详细展开&#xff0c;包括项目背景、具体内容、实施步骤和创新点。如需帮助&#xff0c;或有导航、定位滤波相关的代码定制需求&#xff0c;请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …

毕业项目推荐:基于yolov8/yolov5/yolo11的动物检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

OpenLDAP 进阶指南:复制、引用与别名配置详解

文章目录 1.复制和引用概述2.LDAP 引用3.LDAP 复制4.OpenLDAP 复制4.1 OpenLDAP syncrepl方式复制(从2.3版本开始)4.2 Replication refreshAndPersist (provider Push)4.3 OpenLDAP syncrepl (N-Way) 多主复制 前言 本章提供了关于配置LDAP系统进行复制(replication)、引用(ref…

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域&#xff0c;设计模式是解决常见设计问题的经典方案。1994 年&#xff0c;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&#xff08;四人帮&#xff0c;GoF&#xff09;在《设计模式&#xff1a;可复用面向对象软件的基础》一书中系统性地总结了…

最好用的图文识别OCR -- PaddleOCR(2) 提高检测识别精度 推理效率(PPOCR模型转ONNX模型进行推理)

提高检测识别精度 && 推理效率 基于项目环境准备高效率版本1 下载模型与相关资源2. 模型转换3. 转换后效果测试测试图片示例&#xff1a;使用 PaddleOCR 模型进行推理&#xff1a;使用转换后的 ONNX 模型进行推理&#xff1a; 高精度版本1 下载模型与相关资源2 配置Pad…

保护性暂停原理

什么是保护性暂停&#xff1f; 保护性暂停&#xff08;Guarded Suspension&#xff09;是一种常见的线程同步设计模式&#xff0c;常用于解决 生产者-消费者问题 或其他需要等待条件满足后再继续执行的场景。通过这种模式&#xff0c;一个线程在执行过程中会检查某个条件是否满…

Linux 工作队列

系列文章目录 Linux内核学习 Linux 知识&#xff08;1&#xff09; Linux 知识&#xff08;2&#xff09; Linux 工作队列 Linux 内核源代码情景分析&#xff08;一&#xff09; Linux 设备驱动程序&#xff08;二&#xff09; 文章目录 系列文章目录综述工作&#xff08;work_…

计算机的错误计算(二百零六)

摘要 电脑准备关机时&#xff0c;看到不知什么时候触发跳出了一个**AI助手页面。里面有关于等价的讨论内容&#xff0c;特记录&#xff0c;以警世人&#xff1a;大模型犯错&#xff0c;不是个别现象。 例1. 下面是对话。问题是&#xff1a; 和 等价吗&#xff1f;在 (0, ) …

支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测

简单说明 支持向量回归是一种用来做预测的数学方法,属于「机器学习」的一种。 它的目标是找到一条「最合适的线」,能够大致描述数据点的趋势,并允许数据点离这条线有一定的误差(不要求所有点都完全落在这条线上)。 可以把它想象成:找到一条「宽带」或「隧道」,大部分…

web作业

作业一 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> </head&g…

(六)ROS通讯机制——常用命令

前言 下面这些主要是一些通讯中经常用到的一些命令&#xff0c;大家需要跟着下面的指示操作一遍&#xff0c;有个大致的了解即可。 1.学习目的 机器人系统中启动的节点少则几个&#xff0c;多则十几个、几十个&#xff0c;不同的节点名称各异&#xff0c;通信时使用话题、服…

掌握正则表达式:从入门到精通的实战指南

文章目录 &#x1f30d;一.正则表达式❄️1.为什么学习正则表达式❄️ 2.基本介绍❄️3.分析底层实现 &#x1f30d;二.正则表达式的语法❄️1.字符匹配❄️2.量词❄️3.定位符4.分组和引用❄️6.非贪婪匹配❄️7.分支结构❄️实际应用 &#x1f30d; 三.正则标表达式的三个常用…

【Linux 之一 】Linux常用命令汇总

Linux常用命令 ./catcd 命令chmodclearcphistoryhtoplnmkdirmvpwdrmtailunamewcwhoami 我从2021年4月份开始才开始真正意义上接触Linux&#xff0c;最初学习时是一脸蒙圈&#xff0c;啥也不会&#xff0c;啥也不懂&#xff0c;做了很多乱七八糟&#xff0c;没有条理的笔记。不知…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面&#xff0c;成为Science、Nature论文的…