#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
int main()
{
char name[100];
int key;
printf("enter plaintext:\n");
fgets(name, 100, stdin);
int length = sizeof(name);
printf("please enter key:");
scanf("%d", &key);
printf("plain text: %s\n", name);
printf("ciphertext:");
for (int i = 0; i < length; i++) {
if (name[i] >= 65 && name[i] <= 90) {
int c = (int)(name[i] - 'A');
char d = 'A' + (char)((c + key) % 26);
printf("%c", d);
}
else if (name[i] >= 97 && name[i] <= 122) {
int c = (int)(name[i] - 'a');
char d = 'a' + (char)((c + key) % 26);
printf("%c", d);
}
else
printf("%c", name[i]);
}
return 0;
}
您好, 所以这是我在课程中试图解决的一项练习&#34; cs50&#34;哈佛大学 它是一个ceaser密码,它需要一个字符串,一个密钥,并打印加密: c =(pi + k)%26
c - 最后解密的信件 pi =字母的位置(a = 0.b = 1 ..) k =密钥
我虽然是因为内存分配?但是我还没有触及它,而且我不想使用cs50.h包,因为我想学习它的方式,而不是使用&#34;字符串&#34;像他们一样的变量。
任何帮助都将不胜感激。
答案 0 :(得分:3)
您的问题在于
行int length = sizeof(name);
sizeof
运算符以字节为单位返回变量的大小。在这种情况下,由于name
是char[100]
,因此该对象的大小为100字节。在你给出明文(和密文)的例子中,它们都小得多,所以你的循环遍历并开始打印垃圾内存(即你分配但不用于存储消息的空间)。
您需要使用的是
int length = strlen(name);
返回字符串的长度。请务必添加string.h
标题。