c - 使用凯撒密码加密文本

标签 c algorithm encryption

我正在编写这个接受命令行参数的 C 程序,然后加密用户稍后输入的文本。

我们通过命令行输入一个数字,用于加密。例如,如果我们从命令行输入一个数字 1 然后用户想要加密说“aaaa”,加密的文本将是“bbbb”,只是每个都移动了一个字符。我做了我的输出,但没有打印回文本。我的错误是什么?

这是我的代码

int main(int argc , string argv[])
    {
       if(argc != 2)
         {
            return -1;
         }
    int k = atoi(argv[1]);
    printf("Enter the text to be encrypted : ");
    string text = get_string();
    int length = strlen(text);
    for(int i=0 ; i<length ; i++)
       {
           int p = text[i];
           int c = (p + k) % 26; 
           printf("%c",c);
        }
   }

最佳答案

这里的代码:

int c = (p + k) % 26; 
printf("%c",c);

很可能不会打印任何有值(value)的东西,因为结果值将在 0..25 范围内,在 ASCII 中是不同的控制字符。你想要做的是检查字符是ASCII小写还是ASCII大写,然后才进行旋转,并确保结果也在同一范围内:

unsigned int c = text[i];
if (c >= 'A' && c <= 'Z') {
    c = ((c - 'A') + k) % 26 + 'A';
}
else if (c >= 'a' && c <= 'z') {
    c = ((c - 'a') + k) % 26 + 'a';
}
printf("%c", c);

如果值介于 'A''Z' 之间,我们减去 'A' 的代码,以便这些映射来自025(请注意,我们假设字符代码按字母连续顺序从 AZ 此处 -这适用于 ASCII,但不适用于带有 EBCDIC 的 IBM 大型机,因此请考虑自己被警告!),然后在那里进行模数学运算,然后再次添加 'A' 的代码以获得到原来的范围内。

我们在 else if 中为小写字母做同样的事情。

关于c - 使用凯撒密码加密文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42467794/

相关文章:

c - fgets 在没有接受输入的情况下失败

c - 是否可以使用跟踪服务器来建立我自己的点对点网络?

algorithm - 二叉索引树(Fenwick Tree)——关于更新

android - 是否可以从现有的内存块创建内存中的 SQLite 数据库?

递归查找数组中最大元素的巧妙方法

c - 堆栈段和未初始化数据段的区别

java - 动态规划求解给定和的子集

python - 找到具有最大总和的连续子集

java - 3DES 加密 Oracle/JAVA 等效

使用公钥/私钥加密 iOS 应用程序数据