题解 | #字符串加解密#
字符串加解密
https://www.nowcoder.com/practice/2aa32b378a024755a3f251e75cbf233a
// 字符串加解密 #include <stdio.h> #include <stdlib.h> char EncryChar(char chr) { if (chr >= 'A' && chr <= 'Z') { if (chr == 'Z') return 'a'; else return chr + 32 + 1; } if (chr >= 'a' && chr <= 'z') { if (chr == 'z') return 'A'; else return chr - 32 + 1; } if (chr <= '9' && chr >= '0') { if (chr == '9') return '0'; else return chr + 1; } return 0; } /* 解密方法为加密的逆过程。 //好吧,感觉可以建表,因为给定了只出现大小写字母和数字 //思路如下:建立一个map[26大写+26小写+10] mapfunc要实现输入字符和加密/解密命令参数,返回对应的值 例如,我要加密a,mapfun('a',1),直接找到map[26].enval 如果要解密a,mapfun('a',1),直接找到map[26].deval //这需要有一张表,先对应A-Za-Z0-9与index的关系 //还得要有个函数,能快速返回index */ int Index(char cur) { if (cur >= 'A' && cur <= 'Z') return (int)cur - 65; if (cur >= 'a' && cur <= 'z') return (int)cur - 97 + 26; if (cur >= '0' && cur <= '9') return (int)cur - (int)'0' + 26 + 26; return -1; } //输入index,返回对应的原字符,方便建表的时候数组引用 char Indexforchar(int index) { if (index >= 0) { if (index < 26) return index + 65; if (index < 26 + 26) return index + 97 - 26; //错误点1:没有考虑传进来的index初始值要-26 if (index < 26 + 26 + 10) return index + 48 - 26 - 26; } return 0; } typedef struct { /* data */ char enval; char deval; } mapPoint; //map结构体生成函数 mapPoint* InitMapPoint(int index) { char chr = Indexforchar(index); mapPoint* newPoint = (mapPoint*)malloc(sizeof(mapPoint)); newPoint->enval = EncryChar(chr); newPoint->deval = 0; return newPoint; } //补全map的deval void CompleteMap(mapPoint** mapPoint, int size) { for (int i = 0; i < size; i++) { int newindex = Index(mapPoint[i]->enval); mapPoint[newindex]->deval = Indexforchar(i); } } char mapfunc(char cur, int enOrde, mapPoint** mp) { if (enOrde == 1) return mp[Index(cur)]->enval; else if (enOrde == 0) return mp[Index(cur)]->deval; return 0; } int main() { int size = 26 + 26 + 10; mapPoint** mappoint = (mapPoint**)malloc(size * sizeof( mapPoint*)); //错误点2:malloc(size*sizeof(map))只有62个map结构体(sizeof(map)=2)大小,而不是指针62*8的大小 for (int i = 0; i < size; i++) { mappoint[i] = InitMapPoint(i); //if(mapPoint[i]->enval=='a') //printf("%c ",mapPoint[i]->enval); } CompleteMap(mappoint, size); // for(int i=0;i<size;i++) // { // printf("%c %c %c\n",Indexforchar(i),mapPoint[i]->enval,mapPoint[i]->deval); // } //至此Map建立完成 char str[1001]; int i = 0; gets(str); while (i < 1001) { if (str[i] == '\n' || str[i] == 0) break; str[i] = mapfunc(str[i], 1, mappoint); printf("%c", str[i]); i++; } printf("\n"); i = 0; gets(str); while (i < 1001) { if (str[i] == '\n' || str[i] == 0) break; str[i] = mapfunc(str[i], 0, mappoint); printf("%c", str[i]); i++; } //printf("%d",'0'); return 0; }