#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=钥匙
我的程序给出正确的输出,但最后一行打印垃圾字符:
c - 视觉打印垃圾信件-凯撒密码练习-LMLPHP
我以为是因为内存分配?但我还没有接触过它,我不想使用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/

10-11 22:06
查看更多