Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
凯撒·塞弗在c中表现出罕见的行为_C_Cryptography_Storage - Fatal编程技术网

凯撒·塞弗在c中表现出罕见的行为

凯撒·塞弗在c中表现出罕见的行为,c,cryptography,storage,C,Cryptography,Storage,我在练习c中的凯撒密码,我做了一个功能性的;但它表现出一种奇怪的行为。代码如下所示: #define lenght 18 char * caesar ( char * cyphertext, int key){ static char result [lenght]; for ( int i= 0; i < lenght ; i++){ result [i] =(char)(((int) cyphertext[i]) + ke

我在练习c中的凯撒密码,我做了一个功能性的;但它表现出一种奇怪的行为。代码如下所示:

#define lenght 18
char * caesar ( char * cyphertext, int key){
        static char result [lenght];
        for ( int i= 0; i < lenght ; i++){
                result [i] =(char)(((int) cyphertext[i]) + key) % 255;
        }
        return result;
}
int main(){
        char * text = caesar("Hola buenas tardes", 23 );
        printf("%s \n" , text );
        char * check = caesar( text , 256 - 23);
        printf("%s \n" , check);
        return 0;
        }
#定义长度18
char*caesar(char*cyphertext,int键){
静态字符结果[长度];
对于(int i=0;i
加密版本是x7y | x7x{|;一个较短的数字;但是当我运行第二个带有解密的凯撒密码时
密钥它可以将其解密到原始状态,没有问题。我一直在四处寻找,它可能是关于如何解密的
这些字符是存储的。我非常感谢任何帮助< /P> < P> <代码> Prtff函数不应该用来打印密码文本,它主要支持ASCII字符,并且您有随机不可打印字符。考虑将其转换为十六进制字符串。

加密版本是x7y | x7x{|一个较短的数字

不,上面是
printf
打印的内容。或者更准确地说,这就是终端显示
printf
打印内容的方式。如果您想确切确定加密版本是什么,那么您应该在调试器中运行程序,并使用它检查编码版本的字节

您的方法将对可打印ASCII范围内的一些字符代码进行编码(代码32-126十进制)作为超出该范围的代码。您的终端如何处理这些字节取决于您的配置和环境,但如果它需要UTF-8编码的数据,那么它将在输出中跳过无效的代码序列,如果它需要ISO-8859编码,那么一些输出代码将被解释为C1集中的控制字符还有其他的可能性


通常,Caesar cypher程序会小心地将所有可打印字符映射到其他可打印字符,而不考虑其他字符。典型的学术练习范围更窄,要求程序只映射大写和小写拉丁字母,保留大小写,并保留所有其他字符(标点符号、数字、控制字符)因此,这只是一个练习。

“你好,塔德斯”
是18个字符,这意味着它需要
19
字节来存储,因为NUL终止符。但是您的
结果
数组只有
18
字节。因此,当使用需要字符串的
%s
打印时,存在未定义的行为。这可能不是唯一的问题,而是一个问题。您可能希望使用
uint8_t
而不是
char
,因为
char
可以大于8位。此外,您应该将数组的长度作为参数输入函数,而不是作为定义的常量。您也不应该使用
静态
局部变量,为结果数组分配正确的内存量。虽然
char
的宽度可以超过8位,我不知道现代系统中哪个系统的宽度更宽。此外,无论它有多宽,都是表示字符的正确宽度,在一个宽度超过8位的系统中,将不会有类型
uint8\u t
。因此,不,我认为没有理由选择
uint8\u t
结束时使用内部静态变量,特别是与多线程和可重入性相关的变量,但它本身没有任何问题,并且它提供了避免动态分配给程序(如OP)的明显优势,因为动态分配无法解决程序面临的任何实际问题。