【问题标题】:Encrypt text using Caesar's Cipher使用凯撒密码加密文本
【发布时间】:2017-02-26 19:36:10
【问题描述】:

我正在编写这个 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);
        }
   }

【问题讨论】:

  • string char * 的类型定义,还是什么?
  • 您能否将代码添加到您的问题的get_string() 函数中
  • @AnttiHaapala - 是的。这是here 培育的反模式
  • 停工?我认为它的拼写是“剪刀”。您只需尽可能彻底地与他们一起检查您的文本几次。
  • 我不相信他们在哈佛教这个:D

标签: c algorithm encryption


【解决方案1】:

这里的代码:

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

很可能不会打印任何有价值的东西,因为结果值将在 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' 的代码,以便这些从0 映射到25(请注意,我们假设字符代码按字母顺序连续排序AZ 这里 - 这适用于 ASCII,但不适用于带有 EBCDIC 的 IBM 大型机,所以请注意自己!),然后在那里进行模数运算,然后再次添加 'A' 的代码进入原始范围。

我们在else if 中对小写字母执行相同操作。

【讨论】:

  • 你的代码不起作用兄弟。对于 1 和文本 aaaa 的键,输出为 {{{{
  • @StoryTeller 是的,已修复。
猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 2013-03-13
  • 2014-04-11
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
相关资源
最近更新 更多