关于上次数组越界的问题已经解决,内部定义的数组,函数结束时内存可能被回收。同一个函数定义的变量和数组之类,地址在方法栈中应该是连续的,如果字符串数组不定义结束符,%s输出会越界读取。
采取的方法是
1.尽量使用外部的数组或者指针,或者在函数内部手动分配空间(手动分配空间,系统并不会自动回收空间)!
因为外部指针(数组)在函数内进过修改,不用return,函数结束时影响也在,是直接修改对应地址的值。
2.数组尽量多分配几个空间,以便定义结束符号
3.可以采用数据断点来判断是否越界
以下是正确的feistel算法简单实现,还需留意的是明文加密最后,密文的组成是RiLi,而非LiRi,所以与前面加密分开理解。而解密时最后一步也是如此。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int main()
{
int i=0,j=0;
char key[50]; //key最大位数50位,但是还是只取16位
char plaintext[100]; //明文
char pGroup[10][10]; //明文组
char keyGroup[16][17]; //密码组
void encryption(char pGroup[10][10],char keyGroup[16][17]);
void decryption(char pGroup[10][10],char keyGroup[16][17]);
void generateKey(char key[50],char keyGroup[16][17]);
void makeGroup(char plaintext[100],char pGroup[10][10]);
memset(plaintext,0,sizeof(plaintext)/sizeof(char));
memset(key,0,sizeof(key)/sizeof(char));
memset(pGroup,0,sizeo