视觉打印垃圾信件 - Caesar密码练习

时间:2017-10-08 03:53:06

标签: c encryption cs50 caesar-cipher

#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 =密钥

我的程序提供正确的输出,但最后一行打印垃圾字符: enter image description here

我虽然是因为内存分配?但是我还没有触及它,而且我不想使用cs50.h包,因为我想学习它的方式,而不是使用&#34;字符串&#34;像他们一样的变量。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

您的问题在于

int length = sizeof(name);

sizeof运算符以字节为单位返回变量的大小。在这种情况下,由于namechar[100],因此该对象的大小为100字节。在你给出明文(和密文)的例子中,它们都小得多,所以你的循环遍历并开始打印垃圾内存(即你分配但不用于存储消息的空间)。

您需要使用的是

int length = strlen(name);

返回字符串的长度。请务必添加string.h标题。