#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;
}
你好,
所以这是我在哈佛大学的“cs50”课程中尝试解决的一个练习。
它是一个ceaser密码,它需要一个字符串,一个密钥,然后打印加密:
c=(π+k)%26
c-最后解密的字母
pi=字母的位置(a=0。b=1..)
k=钥匙
我的程序给出正确的输出,但最后一行打印垃圾字符:
我以为是因为内存分配?但我还没有接触过它,我不想使用cs50.h包,因为我想学习c的方式,而不是像它们那样使用“strings”变量。
任何帮助都将不胜感激。
最佳答案
你的问题在于线路
int length = sizeof(name);
sizeof
运算符返回以字节为单位的变量大小。在本例中,由于name
是一个char[100]
对象,因此该对象的大小为100字节。在这个例子中,您给出的明文(和密文)都要小得多,因此循环运行并开始打印垃圾内存(即,您分配但不用于存储消息的空间)。你需要用的是
int length = strlen(name);
返回字符串的长度。确保包含
string.h
标题。关于c - 视觉打印垃圾信件-凯撒密码练习,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46627354/