字符串加密,C语言实现,字母与其下标结合处理

字符串加密

http://www.nowcoder.com/questionTerminal/e4af1fe682b54459b2a211df91a91cf3

字符串加密,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;
}
全部评论

相关推荐

Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-26 18:54
说等下个版本吧的发呆爱好者很贪睡:佬最后去了哪家呀
点赞 评论 收藏
分享
评论
9
收藏
分享
牛客网
牛客企业服务