字符串加密,C语言实现,字母与其下标结合处理,gets获取输入
#include <stdio.h> /* 剔除多余字符,并标记已有的字符(先全存为大写,密文保持通用性,转换密文时处理小写) 补充剩余密码表 得到密文 注意: 地址为空的判断 接收输入字符串使用gets(可能含有空格,不能用scanf) 注意空格的处理 输入字符串为空时,应该是不影响程序结果的,所以没有处理 当输入的任一字符串为空时,可以直接将data拷贝到encrypt,即完成,输出即可 (key为空,则data不变;kay不为空,data为空,则拷贝空串;若均为0,仍输出空串) */ void func_encrypt(char * key,char * data,char * encrypt) { int i,k,index; int flag[26]={0}; char kstr[27]=""; if(key == NULL || data == NULL || encrypt == NULL){ return; } for(i=0,k=0; key[i]!='\0'; i++){ if(key[i]>='A' && key[i]<='Z'){ // 求对应字母表中的下标 index = key[i] - 'A'; }else if(key[i]>='a' && key[i]<='z'){ index = key[i] - 'a'; } flag[index]++; // 标记遇到了几次 if(flag[index] == 1){ // 第一次遇到时才需要加入密钥表 if(key[i]>='A' && key[i]<='Z'){ kstr[k] = key[i]; }else if(key[i]>='a' && key[i]<='z'){ kstr[k] = key[i] - 'a' + 'A'; // 统一存为大写,便于后面处理 } // printf("%d %c ",k,kstr[k]); k++; } } for(i=0; i<26; i++){ if(flag[i] == 0){ // 没有遇到过的字母,存入密钥表 kstr[k] = 'A' + i; // printf("%d %c ",k,kstr[k]); k++; } } kstr[k] = '\0'; // printf("\n"); for(i=0; data[i]!='\0'; i++){ if(data[i] == ' '){ // 注意空格的处理 encrypt[i] = ' '; continue; } if(data[i]>='A' && data[i]<='Z'){ index = data[i] - 'A'; encrypt[i] = kstr[index]; // printf("%c ",encrypt[i]); }else if(data[i]>='a' && data[i]<='z'){ index = data[i] - 'a'; // 注意不能改变密钥表!!若data中有重复字母,就会导致无法对应而出错 encrypt[i] = kstr[index] - 'A' + 'a'; // 保持小写状态 // printf("%c ",encrypt[i]); } // printf("index=%d ",index); // printf("%c ",encrypt[i]); } encrypt[i] = '\0'; // puts(encrypt); // printf("\n"); return; } int main() { char key[100]=""; char data[1000]=""; while(gets(key) && gets(data)){ // 注意可能输入字符串中有空格,用gets而不是scanf char encrypt[1000]=""; func_encrypt(key,data,encrypt); printf("%s\n",encrypt); } return 0; }