凯撒密码在 C 中不起作用
Caesar cipher won't work in C
我正在尝试创建一个凯撒密码,所以我声明了一个将每个字符压入 13 次的函数。然后是另一个函数,它接受一个字符串,然后对其进行加密或解密,我是用 for 循环完成的。
但问题是,当我 运行 程序时,结果是这样的:
Original: This is the Original text
encrypted: QnÇ vÇü qre Bevtvanyüràü
decrypted: DaÇ âÇü der Orâüânaåüeàü
有没有人知道这是什么原因造成的?
#include <stdio.h>
#include <stdlib.h>
int shift = 13;
char shiftchar(char ch){
if( ((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123)) ){
ch = ch + shift;
if(ch > 90 && ch < 104){
ch = ch - 90 +64;
}
else if(ch > 122 && ch < 136){
ch = ch -122 +96;
}
}
else{
ch = ch;
}
}
void cipher (char str[]){
for( int i = 0; str[i] != 0; ++i){
str[i] = shiftchar(str[i]);
}
}
int main(void){
char str[25] = "This is the original text";
printf("Original: ");
printf("%s\n", str);
cipher(str);
printf("encrypted: ");
printf("%s\n", str);
cipher(str);
printf("decrypted: ");
printf("%s\n", str);
}
你好像忘了,一个char
字符串真的叫做null-terminatedbyte string。 null-terminator 非常重要,因为这是所有标准函数都在寻找的字符串结束时间和位置。
您的数组 str
太小,无法容纳终结符。改为将其设为包含 26 个元素的数组。或者不明确指定大小,让编译器设置它。
您的代码有两个简单的错误。首先,char
类型的变量在内存中占用 8 bits
,其值范围从 -128
到 127
。在某些情况下,您的加密字符最终可能会得到一个大于 127
的值,因此您需要使用 unsigned char
作为数据类型,其取值范围从 0
到 255
相反。
因此,您的函数声明应如下所示:char shiftchar(unsigned char ch);
也不需要这行代码:ch = ch;
而且您也没有return您的函数生成的加密字符。
最终函数应如下所示:
char shiftchar(unsigned char ch){
if( ((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123)) ){
ch = ch + shift;
if(ch > 90 && ch < 104){
ch = ch - 90 +64;
}
else if(ch > 122 && ch < 136){
ch = ch -122 +96;
}
}
return ch;
}
您的代码现在可以按预期运行,但要完美完成所有操作,我们需要修改字符数组的大小。您将 main
中数组 char str[]
的大小设置为 25
.
永远不要忘记用于初始化数组的任何字符串文字末尾的不可见 NULL
终止符。
数组声明应该是:char str[26] = "This is the original text";
,你也可以避免忘记[=26=]
的头痛,你可以这样做:char str[] = "This is the original text";
从而把工作留给编译器确定数组的大小 ;)
我测试了你的代码,除了 unsigned
问题,你还缺少 shiftchar
函数中的 return
语句。
char shiftchar(unsigned char ch){
if( ((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123)) ){
ch = ch + shift;
if(ch > 90 && ch < 104){
ch = ch - 90 +64;
}
else if(ch > 122 && ch < 136){
ch = ch -122 +96;
}
}
else{
ch = ch;
}
return ch;
}
我正在尝试创建一个凯撒密码,所以我声明了一个将每个字符压入 13 次的函数。然后是另一个函数,它接受一个字符串,然后对其进行加密或解密,我是用 for 循环完成的。 但问题是,当我 运行 程序时,结果是这样的:
Original: This is the Original text
encrypted: QnÇ vÇü qre Bevtvanyüràü
decrypted: DaÇ âÇü der Orâüânaåüeàü
有没有人知道这是什么原因造成的?
#include <stdio.h>
#include <stdlib.h>
int shift = 13;
char shiftchar(char ch){
if( ((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123)) ){
ch = ch + shift;
if(ch > 90 && ch < 104){
ch = ch - 90 +64;
}
else if(ch > 122 && ch < 136){
ch = ch -122 +96;
}
}
else{
ch = ch;
}
}
void cipher (char str[]){
for( int i = 0; str[i] != 0; ++i){
str[i] = shiftchar(str[i]);
}
}
int main(void){
char str[25] = "This is the original text";
printf("Original: ");
printf("%s\n", str);
cipher(str);
printf("encrypted: ");
printf("%s\n", str);
cipher(str);
printf("decrypted: ");
printf("%s\n", str);
}
你好像忘了,一个char
字符串真的叫做null-terminatedbyte string。 null-terminator 非常重要,因为这是所有标准函数都在寻找的字符串结束时间和位置。
您的数组 str
太小,无法容纳终结符。改为将其设为包含 26 个元素的数组。或者不明确指定大小,让编译器设置它。
您的代码有两个简单的错误。首先,char
类型的变量在内存中占用 8 bits
,其值范围从 -128
到 127
。在某些情况下,您的加密字符最终可能会得到一个大于 127
的值,因此您需要使用 unsigned char
作为数据类型,其取值范围从 0
到 255
相反。
因此,您的函数声明应如下所示:char shiftchar(unsigned char ch);
也不需要这行代码:ch = ch;
而且您也没有return您的函数生成的加密字符。
最终函数应如下所示:
char shiftchar(unsigned char ch){
if( ((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123)) ){
ch = ch + shift;
if(ch > 90 && ch < 104){
ch = ch - 90 +64;
}
else if(ch > 122 && ch < 136){
ch = ch -122 +96;
}
}
return ch;
}
您的代码现在可以按预期运行,但要完美完成所有操作,我们需要修改字符数组的大小。您将 main
中数组 char str[]
的大小设置为 25
.
永远不要忘记用于初始化数组的任何字符串文字末尾的不可见 NULL
终止符。
数组声明应该是:char str[26] = "This is the original text";
,你也可以避免忘记[=26=]
的头痛,你可以这样做:char str[] = "This is the original text";
从而把工作留给编译器确定数组的大小 ;)
我测试了你的代码,除了 unsigned
问题,你还缺少 shiftchar
函数中的 return
语句。
char shiftchar(unsigned char ch){
if( ((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123)) ){
ch = ch + shift;
if(ch > 90 && ch < 104){
ch = ch - 90 +64;
}
else if(ch > 122 && ch < 136){
ch = ch -122 +96;
}
}
else{
ch = ch;
}
return ch;
}