首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加密过程工作半个

加密过程工作半个
EN

Stack Overflow用户
提问于 2018-01-25 08:53:32
回答 3查看 86关注 0票数 0
代码语言:javascript
运行
复制
#include <stdio.h>
#include <string.h>
int main()
{
char inpusr[100];
int i, length,key;
length=100;
scanf("%[^\n]s",inpusr);
scanf("%d",&key);
printf("%s\n", inpusr);
    for(i = 0; i <=length; i++) {
        if(inpusr[i] >= 97 && inpusr[i] <=122) {
            inpusr[i] = inpusr[i] + key;
            if (inpusr[i]>122){
             inpusr[i] = (inpusr[i] - 122)+96;

            }
        }

    }
printf("%s\n", inpusr);
return 0;
}

我用C语言编写了一个程序来加密凯撒密码方法中的字符串,但是为什么当输入为'z‘并且键在6以上时,我的代码不能显示移位的字母表。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-25 09:31:41

首先,遵循一些关于如何操作char数组的指南。Char数组不是String。

代码语言:javascript
运行
复制
char inpusr[100];
scanf("%[^\n]s",inpusr);

如果你在这里输入"Hello“,你知道你在数组中得到了什么吗?.=‘3’>.下一次你可以

代码语言:javascript
运行
复制
#include <string.h>
memset( inpusr , 0 , sizeof(inpusr));

现在关于你的代码你说

代码语言:javascript
运行
复制
if(a>10 && a<100)
{
    if (a<5) // This is a logic error.If a<10 you don't get in to block.
    {
    }
}

出于兴趣凯撒密码方法,是A=(x+n)模26。

这是一个工作代码:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <string.h>

int main()
{
char inpusr[100];
int i, length,key;
length=100;
memset( inpusr , 0 , sizeof(inpusr));
scanf("%[^\n]s",inpusr);
scanf("%d",&key);
printf("%s\n", inpusr);
for(i = 0; i <=length; i++)
{
    if(inpusr[i] >= 97 && inpusr[i] <=122)
    {
        inpusr[i] = (((inpusr[i] - 97 + key) % 26) + 97);
    }
    else if ((inpusr[i] >= 65 && inpusr[i] <=90))
    {
        inpusr[i] = (((inpusr[i] - 65 + key) % 26) + 65);
    }

}
printf("%s\n", inpusr);
return 0;
}
票数 0
EN

Stack Overflow用户

发布于 2018-01-25 09:43:40

基本问题是,当计算每个字符的加密值时,可能会遇到大于127的值,这将导致计算中的溢出,并导致inpuser[i]的负值。

例如,如果inpusr[i]是122 ('z'),键是6,那么inpuser[i]的新值将是-128,而不是128 (这是计算正确的必要条件)。

解决这一问题的一种方法是使用临时int变量重新实现编码字符的计算,这将消除溢出条件。

代码语言:javascript
运行
复制
int main()
{
char inpusr[100];
int i, length,key;
length=100;
scanf("%[^\n]s",inpusr);
scanf("%d",&key);
printf("%s\n", inpusr);
    for(i = 0; i <=length; i++) {
        if(inpusr[i] >= 97 && inpusr[i] <=122) {
            int encoded_char;
            encoded_char = inpusr[i] + key;
            if (encoded_char>122){
             encoded_char = (encoded_char - 122)+96;

        }
        inpusr[i] = encoded_char;
    }

}
printf("%s\n", inpusr);
return 0;
}
票数 0
EN

Stack Overflow用户

发布于 2018-01-25 11:49:19

凯撒密码

代码语言:javascript
运行
复制
#include <stdio.h>
#include <string.h>

int main()
{
    char inpusr[100];
    char key_input[3];
    int key = 0;
    int len = 100;

    fgets(inpusr, len, stdin);
    printf("%s\n", inpusr);
    fgets(key_input, 3, stdin); // to allow -25
    key = atoi(key_input);
    printf("%d\n", key);
    while (len--)
    {
        if (inpusr[len] >= 97 && inpusr[len] <=122)
            inpusr[len] = (inpusr[len] - 97 + (key % 26) + 26) % 26 + 97; // '+ 26' is added in case of negative key
    }
    printf("%s\n", inpusr);
    return 0;
}

避免扫描,因为它是不安全的(您可以利用缓冲区溢出)。

此外,你也不考虑大写字母。

对不起,如果我忘了什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48438949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档