上个月我收到了这个作业,但由于我在此之后会说出问题,最终弄错了。目前,我正在做Caesar的密码,我相信我的格式正确。我问用户一个字符串,并用key == 3
加密。但是,如果明文字母是X
,Y
,Z
,x
,y
或z
,我想循环使用字母表。但是,当我把这些中的任何一个放入时,我不会得到A
,B
和C
,而是]...
和其他大括号。任何解决问题的提示。
谢谢!
void main()
{
int key = 3;
char string[256];
int i = 0;
printf("Enter the string you want encrypted\n");
fgets(string, sizeof(string), stdin);
for (i = 0; i < strlen(string); i++) {
if (string[i] == ' ') {;}
else if ((string[i] >= 'a' && string[i] <= 'z' || string[i] >= 'A' && string[i] <= 'Z')){
string[i] = string[i] + key;
}
}
printf("Cipher text:%s",string);
}
答案 0 :(得分:4)
您需要查看ASCII表:http://www.asciitable.com/。您正在使用字符的ASCII编码。
Z的小数值为90,因此93为&#39;]&#39;。您需要手动回绕到字母表的开头。最好使用模数并添加第一个字母字符的ASCII值。由你如何包装大写字母(回到&#39; a&#39;或者&#39; A&#39;)。
答案 1 :(得分:1)
您需要将字符转换为字母表中的位置,然后找到模26(字母长度)的结果,然后将其转换回字符。类似的东西:
char base = 0;
if(string[i] >= 'a' && string[i] <= 'z'){
base = 'a';
}else if(string[i] >= 'A' && string[i] <= 'Z'){
base = 'A';
}
if(base){
string[i] = ((string[i] - base) + key) % 26 + base;
}
答案 2 :(得分:1)
你几乎得到了它:
#include <stdio.h>
#include <string.h>
int main() {
char string[256];
int i = 0;
int key = 3;
const int num_letters = 26;
printf("Enter the string you want encrypted\n");
fgets(string, sizeof(string), stdin);
for (i = 0; i < strlen(string); i++) {
if (string[i] >= 'a' && string[i] <= 'z') {
string[i] = 'a' + (string[i] - 'a' + key) % num_letters;
}
else if (string[i] >= 'A' && string[i] <= 'Z') {
string[i] = 'A' + (string[i] - 'A' + key) % num_letters;
}
}
printf("Encrypted: %s\n", string);
return 0;
}
Enter the string you want encrypted
Zorro
Encrypted: Cruur
在C中,您可以使用模运算符%
进行环绕,如上所示。祝你好运!