| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 466 人关注过本帖
标题:playfiar一个定义类错误 懂的麻烦看下
只看楼主 加入收藏
slq17
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-4-5
收藏
 问题点数:0 回复次数:2 
playfiar一个定义类错误 懂的麻烦看下
从网上找了一个playfair程序 但是运行一直出现一个定义类错误  自己改不了  会的帮忙改下 谢谢拉~程序如下:

#include <iostream>
#include<stdlib.h>
using namespace std;

#define MAX 1000  //明文空间最大字符数

int main()
{
FILE *fp;
int i=0;
char a[MAX],b[MAX],k[10];  //数组a存放明文字符,数组b存放密文字符,数组k存放密钥字符
fp=fopen("plaintext.txt","r");

//将plaintext.txt中的明文读入明文数组a
do
{
  char ch=NULL;
  fscanf(fp,"%c",&ch);  //数组a存放明文字符
  if(ch!=' ')  //滤除输入中的空格
  a[i++]=ch;
}
while(i<MAX&&a[i-1]!='\n');
static int q=i;  //q为回车位,明文共q-1个字符

//提示可能的明文空间溢出
if(q-1>=1900)
  cout<<"May be overflow..."<<endl;

//将明文中的字符j换为i
for(i=0;i<q-1;i++)
{
  if(a=='j')
  a='i';
}

//将plaintext中的密钥读入密钥数组k
i=0;
do
{
  fscanf(fp,"%c",&k[i++]);
}
while(i<10&&k[i-1]!='\n');
int p=i-1;  //共p位密钥

//将密钥中的字符j换为i
for(i=0;i<p;i++)
{
  if(k=='j')
  k='i';
}

//删掉密钥中重复的字符
for(i=1;i<p;i++)
  for(int j=0;j<i;j++)
  if(k==k[j])
  {
    for(int l=i;l<p-1;l++)
    k[l]=k[l+1];
    p--;
  }

char m[5][5];  //密钥矩阵
char m1[25];  //暂存密钥矩阵元素的辅助数组

//将密钥元素填入数组m1
for(i=0;i<p;i++)
  m1=k;

//将密钥后的其它字母补入数组m1
for(i=p;i<25;i++)
  for(int h=97;h<=122;h++)
  {
  if(h==106)  //////////不要字符j//////////////////
    continue;
  int is=1;  //判断后补入m1的元素是否和密钥重复
  for(int e=0;e<i;e++)
  {
    if(m1[e]==char(h))
    {
    is=0;
    break;  //break只能跳for和while循环
    }
  }
  if(is)
  {
    m1=char(h);
    break;
  }
  }

//将数组m1的元素赋给矩阵m
int j,l;      //i为矩阵行标,j为列标,l指m1数组位标
for(i=0;i<5;i++)   
  for(j=0,l=i*5;j<5,l<(i+1)*5;j++,l++)
  m[j]=m1[l];

//在明文连续相同字符间插入字符x      
int ix=0; //判断是否需要插x
int nx=0; //计算插入x的个数
for(i=0;i<q/2;i++)
{
  if(ix)
  {
  i=0;  //如果插过x,数组奇偶排列已打乱,需重新处理
  ix=0;
  }
  if(a[i*2]==a[i*2+1])
  {
  for(j=q-1;j>=i*2+1;j--)
    a[j]=a[j-1];
  a[i*2+1]='x';
  nx++;
  ix=1;
  }
}

//如果明文总长为奇数,在后面再补一个x
if((q-1+nx)%2!=0)
{
  a[q-1+nx]='x';  
  nx++;    //现明文总长为q-1+nx,且为偶数
}

//利用playfair密钥矩阵,将明文空间映射到密文空间
int r1=5,l1=5;  //r和l分别为矩阵m的行标和列标
int r2=5,l2=5;
for(int g=0;g<(q-1+nx)/2;g++)  //g为数组a和b的行标
{
  for(i=0;i<5;i++)
  for(j=0;j<5;j++)
  {
    if(a[g*2]==m[j])
    {
    r1=i;
    l1=j;
    }
    if(a[g*2+1]==m[j])
    {
    r2=i;
    l2=j;
    }
  }
  if(r1==r2)  //在同一行
  {
  b[g*2]=m[r1][(l1+1)%5];
  b[g*2+1]=m[r2][(l2+1)%5];
  }
  else if(l1==l2)  //在同一列
  {
  b[g*2]=m[(r1+1)%5][l1];
  b[g*2+1]=m[(r2+1)%5][l2];
  }
  else if(l1<l2)  
  {
  b[g*2]=m[r1][l2];
  b[g*2+1]=m[r2][l1];
  }
  else
  {
  b[g*2]=m[r2][l1];
  b[g*2+1]=m[r1][l2];
  }
}

//输出密文到ciphertext.txt
FILE* fo=fopen("ciphertext.txt","w");
for(g=0;g<q-1+nx;g++)
  fprintf(fo,"%c",b[g]);
fprintf(fo,"\n");
fclose(fp);
fclose(fo);
  return 0;
}
搜索更多相关主题的帖子: playfiar 定义 麻烦 
2008-04-08 08:34
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
用c写吧..基本都是c的内容..而且用指针要做好监控..打开的时候看是否打开..

学习需要安静。。海盗要重新来过。。
2008-04-08 09:50
slq17
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-4-5
收藏
得分:0 
主要是前面定义了
char a[MAX],b[MAX],k[10];  //数组a存放明文字符,数组b存放密文字符,数组k存放密钥字符
后面  if(a=='j')  把a当整型的了 =.=  (后面还有几个,情况相同的) 我改来改去不行...  
在学C++呢  还是谢谢楼上的
2008-04-08 12:30
快速回复:playfiar一个定义类错误 懂的麻烦看下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020324 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved