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

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

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

目标

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

思路

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

相关规则

是个大概

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

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

2、加密的函数

现在先写一个框架

cs 复制代码
#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)。
  • 如果字符不是字母或数字,函数返回零。

具体编写

cs 复制代码
#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)
{

}*/

接下来就是加密函数

cs 复制代码
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++;
    }
}

写完就是这个

cs 复制代码
#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++;
    }
}

解码函数

cs 复制代码
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、编程流程图

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

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

相关推荐
咕噜企业签名分发-淼淼4 小时前
浅谈云服务器在后端托管与签名分发场景中的应用价值
开发语言·php
在繁华处5 小时前
Java从零到熟练(八):泛型与注解
java·开发语言·python
SilentSamsara5 小时前
命令行工具开发:Click/Typer + 打包为独立二进制
linux·服务器·开发语言·前端·python·青少年编程·fastapi
Ulyanov5 小时前
深入QML滑块与进度控制:构建动态数据可视化界面:QML+PySide6现代开发入门(六)
开发语言·python·算法·ui·信息可视化·雷达电子对抗仿真
星马梦缘5 小时前
ACM笔记 学习版本
数据结构·c++·算法
zyl837215 小时前
Python 函数、模块、异常处理 超详细入门教程
开发语言·windows·python
CQU_JIAKE5 小时前
6.1【A】
算法
wayz115 小时前
Momentum:CTI(相关趋势指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
苏州IT威翰德5 小时前
苏州IT基础架构IQ/OQ/PQ确认服务 | 服务器网络验证
开发语言·php
fengxin_rou5 小时前
【滑动窗口与前缀和算法实战】:LeetCode560.438 高频题深度解析
java·算法·leetcode