【问题标题】:Encrypt a text using a key while preserving the case?在保留大小写的同时使用密钥加密文本?
【发布时间】:2017-09-18 11:43:39
【问题描述】:

任务:凯撒算法(密码 (c))通过密钥 (k) 位置“旋转”每个字母来加密消息。

实现:ci = (pi+k)mod26 其中 ci 是密码,pi 是明文,k 是密钥。

我的伪代码:

  1. 从命令行参数获取密钥。
  2. 将键 (k) 转换为整数。
  3. 提示用户输入纯文本 (pi)
  4. 对于每个纯文本字符,保留大小写(在 C 中使用 isalpha、isupper 和 islower 函数。
  5. 最后按键转换明文字符,例如 - “回家!” --- “Hp Ipnf!” (如果键 k = 1,并保留字母的大写/小写,! 保持为 !)。 ** 我正在为此苦苦挣扎
  6. 打印密文。

int main (int argc, string argv[]) //get key from command line argument        
     { 
      if (argc != 2 || atoi(argv[1]) < 0)
       { 
        printf ("print valid key");
        return 1;
       }

       int k = atoi(argv[1]);

       string p = get_string(); //prompt for plaintext

      for (int i=0, n = strlen(p); i < n; i++)
       { if (isalpha('p'))
        {
         if (isupper('p'))
         {
          printf ("%c", p[i]);
         }
         if (islower('p'))
         {
          printf ("%c", p[i]);
         }
        }
       }

     c[i]=(p[i]+k)%26;
      printf ("%c", c[i]);
     }

【问题讨论】:

  • 这里有问题吗?
  • 刚刚编辑了我的问题。正如我在伪代码中提到的那样,我正在努力改变字母。
  • 什么是c?它没有在这个范围内声明。您的想法是正确的,但是当您 % 26 最终得到一个介于 0 和 25 之间的数字时,这些大多数是不可打印的 ASCII 字符,您需要将 'a''A' 添加回它以使它们在字母表中.
  • isalpha('p') 将始终返回 true,因为 p 是一个字母。也许您的意思是 isalpha(p[i])
  • 谢谢!我正在尝试打印 ASCII 字符,我应该添加“a”还是“A”来打印字母?

标签: encryption cs50 caesar-cipher


【解决方案1】:

实际上,您编写的代码只会返回您输入的纯文本的值 这个问题的逻辑是 c[i]=(p[i]+k)%26 你必须对大写和小写应用这个公式不同 我可以给你一个sn-p的代码,这将帮助你解决你的问题

int l = (p[ i ] -65+k)%26 printf("%c",l+65);

这里,k是关键 在此我使用了字母的 ASCII 值,因为 ASCII 值是整数,我使用整数来存储值并应用给定的操作。 我使用了 65,因为大写“A”的 ASCII 值是 65。 由于我们必须打印我们使用 %c 来打印字符的字符。 这是大写的,你可以用小写做类似的 如果这个答案有帮助,请点击旁边的箭头 谢谢你:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2014-10-24
    • 2013-01-25
    • 1970-01-01
    • 2012-06-26
    • 2014-02-21
    • 2020-09-08
    相关资源
    最近更新 更多