2017-10-08 55 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標題。