[英]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;
行為未定義溢出 。 例如,如果您使用字符z
( ASCII碼中的十進制122)和6的shift
(將導致128),但帶signed char
最多可容納127,則會發生這種情況。
1只我寫“可以抱signed char
的”,因為C標准使得IT到實施定義羯羊一個char
是signed
或unsigned
,但對於GCC和MSVC一個char
將是一個signed char
默認。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.