簡體   English   中英

C中的凱撒密碼-加密和解密

[英]Caesar cipher in C - encryption and decryption

我編寫了這個程序,似乎不起作用,您能告訴我為什么嗎? 我花了大約3個小時才弄清楚為什么它不起作用,但是我沒有頭緒。 我想知道這是否與班次無關,但我不確定。 這是我的第一個程序,對一些基本錯誤感到非常抱歉。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {

   char message[100];
   int shift;
   int i;
   int choice;

   printf("Enter operation with message\n");
   printf("encrypt - 1\n");
   printf("decrypt - 2\n");
   scanf("%d", &choice);

   switch(choice)
   {
      case 1:
      {
         printf("Enter message to encrypt\n");
         scanf("%d", &message);

         printf("Enter shift\n");
         scanf("%d", &shift);

         for (i = 0; message[i] != '\0'; i++)
         {
            message[i] = message[i] + shift;
            if (message[i] > 'z')
               message[i] = message[i] - 26;
         }
         printf("Encrypted message: %s\n", message);
         break;
      }
      case 2: 
      {
         printf("Enter message to decrypt\n");
         scanf("%d", &message);

         printf("Enter shift\n");
         scanf("%d", &shift);

         for (i = 0; message[i] != '\0'; i++)
         {
            message[i] = message[i] - shift;
            if (message[i] > 'z')
               message[i] = message[i] - 26;
         }
         printf("Decrypted message: %s\n", message);
         break;
      }
   }

   return (EXIT_SUCCESS);
}

這是輸出屏幕:

屏幕截圖

始終注意編譯器警告。 如果我編譯您的代碼,則會收到以下警告(以及更多警告):

 ../main.c:21:10: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'char (*)[100]' [-Wformat=] scanf("%d", &message); ^ ../main.c:38:10: warning: format '%d' expects argument of type 'int *', but argument 2 has type 'char (*)[100]' [-Wformat=] scanf("%d", &message); ^ 

有兩個主要問題:

1. scanf()格式說明符錯誤:

在cppreference上閱讀有關不同格式說明符的信息
在您的代碼中,您正在使用:

char message[100];
scanf("%d", &message);

但是代替用於int%d ,它應該是C字符串( char* )的%s 最好使用%99s來避免字符串格式漏洞 此外,它應該只是message而不帶“& &因為數組名將衰減char*&message將是指向數組的指針: char (*)[100] 這將導致警告,因為%s期望使用char*

char message[100];
if (1 != scanf("%99s", message)) /* buffer size - 1 */
   return EXIT_FAILURE;

此外, scanf()返回成功讀取的元素數。 我建議始終檢查指示錯誤的返回值。

2.解密中的邏輯錯誤:

代替檢查message[i] > 'z'它必須是message[i] < 'a'因為您要減去shift值。 在這種情況下,請進一步加26而不是減去。

for (i = 0; message[i] != '\0'; i++)
{
   message[i] = message[i] - shift;
   if (message[i] < 'a')
      message[i] = message[i] + 26;
}

編輯#1:

關於您鍵入的消息還有另一個邏輯問題。您的代碼僅適用於包含小寫字母的消息。 您可以擴展它以使用大寫字母。

此外,由於聲明為char message[100];緩沖區可能會保留帶signed char 1 char message[100]; ,這表示是否計算: message[i] = message[i] + shift; 行為未定義溢出 例如,如果您使用字符zASCII碼中的十進制122)和6的shift (將導致128),但帶signed char最多可容納127,則會發生這種情況。


1只我寫“可以抱signed char的”,因為C標准使得IT到實施定義羯羊一個charsignedunsigned ,但對於GCC和MSVC一個char將是一個signed char默認。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM