与硬编码输入相比,使用 fgets 从用户获取密钥时无法打印密钥流
Posted
技术标签:
【中文标题】与硬编码输入相比,使用 fgets 从用户获取密钥时无法打印密钥流【英文标题】:Cannot print key-stream when using fgets to get key from user compared to hard coding inputs 【发布时间】:2020-02-29 23:52:09 【问题描述】:我正在尝试使用 fgets 而不是使用一个程序对数组进行硬编码,该程序采用明文和密钥输入并返回密钥流和加密文本。使用 fgets 从用户那里扫描密钥以某种方式将输出更改为不打印密钥流,而只打印密钥本身。我唯一改变的不是用数组对密钥字符串进行硬编码,而是让用户使用 fgets 输入密钥。
硬编码(sn-p):
#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] = '\0';
printf("Original Message: %s", msg);
printf("\nKey: %s", key);
printf("\nNew Generated Key: %s", newKey);
fgets (sn-p):
#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] = '\0';
printf("Original Message: %s", msg);
printf("\nKey: %s", key);
printf("\nNew Generated Key: %s", newKey);
【问题讨论】:
【参考方案1】:查看下面的代码,它对您的 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] = '\0';
printf("Original Message: %s", msg);
printf("\nKey: %s", key);
printf("\nNew Generated Key: %s", newKey);
我改变了两件事。首先,在您调用fgets
之后,我将获得msgLen
和keyLen
的代码移动到了,这样您就不会占用未初始化内存的strlen
。其次,我更正了if (j == keylen - 1)
行中的一个错误,因此fgets
的换行符不包含在您的输出中。
【讨论】:
以上是关于与硬编码输入相比,使用 fgets 从用户获取密钥时无法打印密钥流的主要内容,如果未能解决你的问题,请参考以下文章