当前位置: 首页 > 知识库问答 >
问题:

加/解密段落的凯撒密码程序

周学义
2023-03-14

首先,我是编程的新手,所以要温柔。而且,我一直在做这个任务,但没有任何结果。任务是创建一个凯撒密码程序,它加密或解密一个段落最多100个字符。实际上是两个独立的实验室。第一个实验是加密,然后第二个实验是解密。一旦我弄清楚了如何创建加密程序,解密程序应该很简单,因为我可以只进行语义更改来解密而不是加密。无论如何,这是我到目前为止的代码。它通过了他们给我们的5个测试中的4个,但出于某种原因,有一个测试的最终字符是“@”符号。这对我来说毫无意义,因为它不会在任何其他测试中发生,而且我相信我的代码在字符串的位置放置了一个'\0'符号,所以'@'不应该在这次测试中出现。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

// ---------------------- DO NOT MODIFY THIS SECTION -----------------------    ---------
#define MAX_PGRAPH_LENGTH 100
#define MAX_WORD_LENGHT 20

int main(void) {   
// definitions
char plaintext[MAX_PGRAPH_LENGTH] = "";
char ciphertext[MAX_PGRAPH_LENGTH];
char input[MAX_WORD_LENGHT];    

// read the key
int key;
scanf("Key: %d, ", &key);

// read text
scanf("Input: ");
while (true)
{
    scanf("%s", input);
    if (strlen(plaintext) + strlen(input) + 1 > MAX_PGRAPH_LENGTH)
        break;

    strcat(plaintext, input);
    strcat(plaintext, " ");
}
plaintext[strlen(plaintext) - 1] = '\0';
// ---------------------- --------------------------------------------------    ---------




int i;

for(i = 0; i < strlen(plaintext); ++i) 
{

  if(plaintext[i] >= 'a' && plaintext[i] <= 'z') {
     ciphertext[i] = ((plaintext[i] + (key % 26) - 97) % 26) + 97; 

     if(ciphertext[i] > 'z') {
        ciphertext[i] = ((plaintext[i] + (key % 26) - 97) % 26) + 97 - 26; }
  }


  else if(plaintext[i] >= 'A' && plaintext[i] <= 'Z') {
     ciphertext[i] = ((plaintext[i] + (key % 26) - 'A') % 26) + 'A';

     if(ciphertext[i] > 'Z') {
        ciphertext[i] = ((plaintext[i] + (key % 26) - 'A') % 26) + 'A' - 26; }
  }

  else {
     ciphertext[i] = plaintext[i]; }

}
 for(i = 0; i < strlen(plaintext) && plaintext[i] == '\0'; ++i) {
  ciphertext[i] = '\0'; }



// ---------------------- DO NOT MODIFY THIS SECTION -----------------------    ---------
printf("   Key: %d\n", key);
printf(" Input: %s\n", plaintext); 
printf("Output: %s\n", ciphertext);
// ---------------------- --------------------------------------------------    ---------
}

正如你所看到的,实验室给了我们设置和多个代码块,我负责实际凯撒密码部分的编码。我的问题是,我是否没有正确地将'\0'设置在C语言的最后一个位置?我还注意到的一件事是,如果我输入一个输入,如“狗跑”,当输入打印到屏幕上时,它将打印“狗跑跑跑…”直到它达到100个字符。幸运的是,他们给我们运行的所有测试都是超过100个字符的段落,所以我实际上不必担心通过加密少于100个字符的测试。但是我仍然想知道为什么我的明文字符串一遍又一遍地重复最后一个输入单词。很抱歉这篇荒唐的帖子,我已经尝试了所有的方法,但不知道哪里出了问题。

共有1个答案

张可人
2023-03-14

它重复最后一个单词,因为您没有退出无限循环。

while (true)
{
    scanf("%s", input);
    if (strlen(plaintext) + strlen(input) + 1 > MAX_PGRAPH_LENGTH)
        break;

    strcat(plaintext, input);
    strcat(plaintext, " ");
}

退出循环的唯一方法是执行break语句,而且只有在inputplaintext的总长度大于max_pgraph_length时才可能。只重复最后一个单词的原因很可能是scanf()逐字读取输入。

另外,您没有通过@character测试用例的原因可能是字母字符以decimal 65开头(对应于A),而@的decimal值是64。在我看来,A和@being 1之间的区别和代码在测试用例中使用@失败之间的区别并不是巧合。因此,我认为您应该仔细检查算术运算,并跟踪示例输入的代码。

 类似资料:
  • 我需要编写一个python、hacker和wow这些单词的加密文本,并且使用不包括使用RAW_INPUT的python中的凯撒密码,距离为3。这是我到目前为止,但我不断得到一个错误消息,我不知道如何修复它。

  • 我想知道如何限制加密的ASCII范围从32-126。 这个是用来解密的 我的加密工作得很好(当我引用解密函数时),但我的解密并不像它应该的那样工作。 额外注意:我们只需要在编码时进行右移,给出一个字符串供整个程序加密和解密(“这是C++”) 注意:在添加更多代码描述的过程中

  • 我目前正在学习如何使用Python中的凯撒密码方法进行加密/解密。我已经研究了如何加密'14:00/船只就位',以接收'7,21,18,_6,21,22,3,6,_14,5,18,_22,1,_3,2,6,22,7,22,2,1',但正在努力如何编写解密代码。具体地说,我不确定如何使用if/else语句正确地反转原始加密,以及如何将数字转换回字母。每封信将根据小时(班次)的变化。 解密代码

  • 问题内容: 我通过java进行了凯撒密码,它可以运行,但是在用户输入密钥后不对任何内容进行加密! 这是我的代码 跑: 问题答案: 使用效率不是很高…您可以对值进行整数运算以获得其索引。 我在代码中添加了注释以解释更多信息,但这就是我想出的。 输出应该是这样的

  • 示例:返回。如果给定的整数值小于0或大于26,则应返回空字符串。 我的问题是,作为回报,它只给我真或假。如何解决这个问题:该方法应该返回一个字符串,其中每个字符都是根据指定的整数值移动的。