与硬编码输入相比,使用 fgets 从用户获取密钥时无法打印密钥流

Cannot print key-stream when using fgets to get key from user compared to hard coding inputs

我正在尝试使用 fgets 而不是使用采用纯文本和密钥输入以及 returns 密钥流和加密文本的程序对数组进行硬编码。使用 fgets 扫描用户的密钥以某种方式将输出更改为不打印密钥流,而仅打印密钥本身。我唯一改变的是,我没有使用数组对密钥字符串进行硬编码,而是让用户使用 fgets 输入密钥。

硬编码(片段):

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

int main(void)
{
   char msg[] = "THECRAZYPROGRAMMER";
   char key[] = "HELLO";
   int msgLen = strlen(msg), keyLen = strlen(key), i, j;
   char newKey[msgLen], encryptedMsg[msgLen], decryptedMsg[msgLen];

   //generating new key
   for(i = 0, j = 0; i < msgLen; ++i, ++j){
      if(j == keyLen)
         j = 0;

    newKey[i] = key[j];
   }

   newKey[i] = '[=10=]';
   printf("Original Message: %s", msg);
   printf("\nKey: %s", key);
   printf("\nNew Generated Key: %s", newKey);
}

fgets(片段):

#include <stdio.h>
#include <string.h>
int main(void)
{
   char msg[512];
   char key[512];
   int msgLen = strlen(msg), keyLen = strlen(key), i, j;
   char newKey[msgLen], encryptedMsg[msgLen], decryptedMsg[msgLen];

   fgets(msg, 512, stdin);
   fgets(key, 512, stdin);

   //generating new key
   for(i = 0, j = 0; i < msgLen; ++i, ++j){
      if(j == keyLen)
         j = 0;

    newKey[i] = key[j];
   }

   newKey[i] = '[=11=]';
   printf("Original Message: %s", msg);
   printf("\nKey: %s", key);
   printf("\nNew Generated Key: %s", newKey);
}

查看下面的代码,其中对您的 fgets 代码进行了一些修改。

#include <stdio.h>
#include <string.h>
int main(void)
{
   char msg[512];
   char key[512];

   fgets(msg, 512, stdin);
   fgets(key, 512, stdin);

  int msgLen = strlen(msg), keyLen = strlen(key), i, j;
   char newKey[msgLen], encryptedMsg[msgLen], decryptedMsg[msgLen];

   //generating new key
   for(i = 0, j = 0; i < msgLen; ++i, ++j){
      if(j == keyLen - 1)
         j = 0;

    newKey[i] = key[j];
   }

   newKey[i] = '[=10=]';
   printf("Original Message: %s", msg);
   printf("\nKey: %s", key);
   printf("\nNew Generated Key: %s", newKey);
}

我改变了两件事。首先,我将获得 msgLenkeyLen 的代码移动到调用 fgets 之后,这样您就不会使用 strlen 未初始化的内存。其次,我更正了 if (j == keylen - 1) 行中的一个差一错误,以便 fgets 的换行符不包含在输出中。