2017-10-08 117 views
0
#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视觉打印垃圾信件 - 凯撒密码锻炼; Tibial

c - 接收最终解密信 PI =的位置的字母(A = 0 b = 1 ..) K =关键

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

不过,我觉得这是因为内存分配?但是我还没有触及它,我不想使用cs50.h包,因为我想按照它的方式学习c,而不是像他们那样使用“字符串”变量。

任何帮助,将不胜感激。

+0

你的缓冲区中有'sizeof'字节,但'%s'只能初始化它读取的字节数。而不是循环到'length',只循环到'strlen(name)'(并且包括'') –

回答

3

你的问题是与线

int length = sizeof(name); 

sizeof操作返回字节变量的大小。在这种情况下,由于namechar[100],此对象的大小为100个字节。在这个例子中,你给出的明文(和密文)都小得多,所以你的循环结束并开始打印垃圾内存(即你分配但没有用来存储消息的空间)。

你需要什么,而不是用的是

int length = strlen(name); 

它返回字符串的长度。一定要包含string.h标题。