【问题标题】:Visual prints garbage letters - Caesar cipher excercise视觉打印垃圾字母 - 凯撒密码练习
【发布时间】:2017-10-08 03:53:06
【问题描述】:
#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”课程中一直试图解决的一个练习。 这是一个停止者密码,它需要一个字符串、一个密钥,并打印加密: c=(pi+k) % 26

c - 最终解密的字母 pi = 字母的位置 (a=0. b = 1..) k = 钥匙

我的程序给出了正确的输出,但最后一行打印了垃圾字符:

我虽然是因为内存分配?但是我还没接触过,也不想用cs50.h包,因为我想按原样学习c,而不是像他们那样使用“字符串”变量。

任何帮助将不胜感激。

【问题讨论】:

  • 您的缓冲区中有sizeof 字节,但%s 仅初始化它读取的字节数。不要循环到length,而是只循环到strlen(name)(包括&lt;string.h&gt;

标签: c encryption cs50 caesar-cipher


【解决方案1】:

你的问题在于线路

int length = sizeof(name);

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

你需要改用的是

int length = strlen(name);

返回字符串的长度。请务必包含 string.h 标头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2014-03-07
    相关资源
    最近更新 更多