我正在尝试创建一个Caesar密码,所以我声明了一个将每个字符推送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);
}
答案 0 :(得分:1)
你的代码有两个简单的错误。首先,类型为char
的变量在内存中占用8 bits
,其值范围为-128
到127
。在某些情况下,加密字符的最终值可能会大于127
,因此您需要使用unsigned char
作为数据类型,其值范围为0
到{{1}而不是。
因此,您的函数声明应如下所示:255
也不需要这行代码:char shiftchar(unsigned char ch);
并且您也没有从函数中返回生成的加密字符。
最终功能应如下所示:
ch = ch;
现在您的代码将按照需要运行,但要完成所有操作,我们需要修改字符数组的大小。您可以将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;
}
中数组char str[]
的大小设置为main
。
永远不要忘记用于初始化数组的任何字符串文字末尾的不可见25
终止字符。
数组声明应该是:NULL
,你也可以避免忘记char str[26] = "This is the original text";
的麻烦,你可以这样做:\0
从而将作业留给编译器确定数组的大小;)
答案 1 :(得分:0)
您似乎忘记了char
字符串实际上称为 空终止 字节字符串。 null-terminator 非常重要,因为这是所有标准函数都在寻找知道字符串何时何地结束的内容。
您的数组str
很小,以适应终结符。使它成为一个由26个元素组成的数组。或者不要显式指定大小,让编译器设置它。
答案 2 :(得分:0)
我测试了您的代码,除了$(document).ready(function () {
var siteWidth = $('.container').width();
$('.navbar').width(siteWidth);
});
问题之外,您还缺少unsigned
函数中的return
语句。
shiftchar