c on printer 第九章 课后题 (编码)

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define NUL 0
#define SIZE 27 
int 
prepare_key( char *key){
	char *head = key;
	char *mark =key;
	char *index;
	int ch;
	while ( *key !=  NUL ){//全部转为大写 
		    if ( !(*key>= 'A' && *key<='Z' ) &&  !(*key>='a' && *key<='z')  ) 
		         return 0;
		         if(*key>='a')
		            *key-=32;
		            key++;        
	}//1  k == NUL
       while( *mark!=NUL){//剔除重复利用 strcpy(n,n+1)  n-->删了  
       	       if( ( index=strchr(mark+1,*mark) ) ==NULL ){
       	       	           mark++;
       	       	            continue;
				  }
       	                
       	 else 
			 strcpy( index,index+1);
	   }//1
	   index= head ; 
	    while(*index++ != NUL)//定位删除后结尾 
	                ;

     for(index -= 2,ch='A';ch<='Z';ch++){    //strchr查找  没有添加到末尾  
	  	  if( strchr(head,ch) == NULL )
	  	     *index++ = ch;
	  }
	          *index=NUL;
	
	  return 1;	 
}
void
encrypt( char*data, char const *key){
	 while( *data !=NUL ){
	 	   if( isalpha(*data) ){ //若为字母     
               if( isupper(*data) )
                 *data = *(key + *data - 'A');     //与首字母的相对位置   再与key对应 
               else
                  *data = *(key + *data - 'a');
			}
			data++;
	 } 
	
} 
void
decrypt(char *data,char const *key){
	 char *head=data;
	 int index=0;
	 while( *data !=NUL ){
	 	     if( isalpha(*data) ) { //若为字母    
			    
			    for(index = 0; *(key + index) != *data; index++);
			        if( isupper(*data) )
                      *data = 'A' + index;
                      else  
                       *data = 'a' + index; 
       }
			data++;
	 }
}
int main(){
	 char key[SIZE]="sdfadsfasdf";
	 if(prepare_key(key) )
	    printf("编码成功!\n");
		        else   
				   printf("失败!\n");
	 char b[]="aaaaaaaaaaa";
	 printf("源码为\n%s\n",b);
	 encrypt(b,key);
	 printf("加密后:\n");
	 puts(b);
	 printf("解密后为:\n");
	 decrypt(b,key);
	 puts(b);
	 
	 
	 
	 
	 return 0; 
}

 有一种技巧可以对数据进行加密, 并使用一个单词作为它的密钥. 下面是它的工作原理:
        首先, 选择一个单词作为密钥. 如:TRAILBLAZERS. 如果单词中包含重复的字母, 只保留第一个, 其余几个丢弃.
        现在, 修改过的那个单词列于字母表的下面, 如下所示:
        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
        T R A I L B Z E S
        
        最后, 底下的那行字母用剩余的字母填充完整:
        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
        T R A I L B Z E S C D F G H J K M N O P Q U V W X Y

        在对信息进行加密时, 信息中的每个字母被固定于顶上那行, 并用下面那行的对应字母一一取代原文的字母.
        因此, 使用这个密钥, ATTACK AT DAWN(黎明时进攻)就会被翻译成TPPTAD TP ITVH.

        这个题材共有三个程序(包含下面两个题目). 在第一个程序中, 你需要编写函数:
        int prepare_key( char *key );
        
        它接受一个字符串参数, 它的内容就是需要使用的密钥单词. 函数根据上面描述的方法把它转化成一个包含编好码的字符串数组. 假定key参数是个字符数组, 其长度至少可以容纳27个字符.
        函数必须把密钥中所有的字符要么转化成大写字母, 要么转化成小写字母(随你选择), 并且从单词中去除重复出现的字母, 然后再用字母表中剩余的字母按照你原先所选择的大小写形式填充到key数组中.
        如果处理成功, 函数返回一个真值. 如果key参数为空或者包含任何非字母字符, 函数返回一个假值.
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值