请教这个程序

ringbellxxh 2004-11-02 09:49:49
//Encrypt.cpp
#include <iostream>

#include "Message.h"
#include "Table.h"
using namespace std;

#define MAXLENGTH 256

void getMessage(char& amessage, char& akey);

int main(int argc, char* argv[])
{
Message myMessage;

if(argc != 2)
{
cout << "usage: " << argv[0] << ".exe -d or -e" << endl;
return 0;
}

if( !strcmp(argv[1], "-d"))
{
myMessage.getMessage();
myMessage.getKey();
myMessage.decryptMessage();
}



//Message.cpp
#include <iostream>
#include <string>
#include <stdio.h>

#include "Message.h"
#include "table.h"

using namespace std;

//Default constructor
Message::Message()
{}

//Constructor
Message::Message(const char* pStr, const char* key)
{
int i, j;

pUnMessage = new char[ strlen(pStr) + 1 ];
strcpy(pUnMessage, pStr);

pEnMessage = new char[ strlen(pStr) + 1 ];
strcpy(pEnMessage, pStr);

pKey = new char[ strlen(pStr) + 1 ];
strcpy(pKey, pStr);

for(i = 0, j = 0; i < strlen(pStr), j < strlen(pStr); i++, j++)
{
if(key[j] && pKey[i])
{
pKey[i] = key[j];
}
else if(key[j] == '\0')
{
j = -1;
i--;
}
else
break;
}
}

//Constructor for only the message, not the key
Message::Message(const char* pStr)
{
pUnMessage = new char[ strlen(pStr) + 1 ];
strcpy(pUnMessage, pStr);

pEnMessage = new char[ strlen(pStr) + 1 ];
strcpy(pEnMessage, pStr);
}

//Encrypts message and returns encrypted message
void Message::encryptMessage()
{
int across, down;
int i, j;


cout << "Encrypting message..." << endl;
cout << endl << pKey << endl << pUnMessage << endl << endl;
for(j = 0; j < strlen(pEnMessage); j++)
{
for(i = 0; i < 26; i++)
{
if( !(isalpha(pUnMessage[j])))
{
across = 30;
break;
}

if( ( toupper(pUnMessage[j]) == table[0][i]))
{
across = i;
break;
}
}

for(i = 0; i < 26; i++)
{
if( !(isalpha(pUnMessage[j])))
{
down = 30;
break;
}

if( ( toupper(pKey[j]) == table[i][0]))
{
down = i;
break;
}
}

if(across != 30 && down != 30)
pEnMessage[j] = table[down][across];
}
cout << pEnMessage << endl << endl;
}

void Message::decryptMessage()
{
int down, across, i, j;

cout << "Decrypting message..." << endl;
cout << endl << pKey << endl << pEnMessage << endl << endl;

for(j = 0; j < strlen(pEnMessage); j++)
{
for(i = 0; i < 26; i++)
{
if( !(isalpha(pKey[j])))
{
across = 30;
break;
}

if( ( toupper(pKey[j]) == table[0][i]))
{
across = i;
break;
}
}

for(i = 0; i < 26; i++)
{
if( !(isalpha(pEnMessage[j])))
{
down = 30;
break;
}

if( ( toupper(pEnMessage[j]) == table[i][across]))
{
down = i;
break;
}
}

if(down != 30)
pUnMessage[j] = table[down][0];
}

cout << pUnMessage << endl;
}

//Returns unencrypted message
const char* Message::getUnMessage() const
{
if(pUnMessage)
return pUnMessage;
else
return "null pointer (should never happen, default constructor is private";
}

//Returns encrypted message
const char* Message::getEnMessage() const
{
if( strcmp(pEnMessage, pUnMessage))
return pEnMessage;
else
return "Message not yet encrypted";
}


//Gets message to encrypt
void Message::getMessage()
{
char* pTemp = new char[256];

cout << "Enter your message (less than 256 characters, end with \"ENTER\": " << endl;
fflush(stdin);
cin.getline(pTemp, 256, '\n');
cout << endl;

pUnMessage = new char[ strlen(pTemp) + 1 ];
strcpy(pUnMessage, pTemp);

pEnMessage = new char[ strlen(pTemp) + 1 ];
strcpy(pEnMessage, pTemp);

delete[] pTemp;
}

void Message::getKey()
{
if(!pUnMessage)
{
cout << "You have to enter the message before you enter the key." << endl;
return;
}

char* pTemp = new char[32];

cout << "Enter your key (less than 32 characters, one word) that ends with \"ENTER\": " << endl;
fflush(stdin);
cin.getline(pTemp, 32, '\n');
cout << endl;

pKey = new char[ strlen(pUnMessage) + 1 ];
strcpy(pKey, pUnMessage);

int i, j;

for(i = 0, j = 0; i < strlen(pUnMessage), j < strlen(pUnMessage); i++, j++)
{
if(pTemp[j] && pKey[i])
{
pKey[i] = pTemp[j];
}
else if(pTemp[j] == '\0')
{
j = -1;
i--;
}
else
break;
}

delete[] pTemp;
}


//Destructor
Message::~Message()
{
delete[] pUnMessage;
delete[] pEnMessage;
delete[] pKey;
}

这是我从网上下载的源代码,还有两个头文件,table.h是一个26*26的字符数组,是26个英文大写字母.现在我编译没有错误,可是一运行就出致命的错误,系统就得结束程序.
我觉得问题应该出现在int main(int argc, char* argv[])函数中,我原来也试着编过此类型的函数,但是也是一运行就出错,我不知道这个函数到底怎么是用,即参数的值到底从哪里传过来的?都有什么可选项?我不知道,看了好多书都讲的不是太清楚.还请各位高手详细指点一下



多谢多谢
...全文
112 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yegaofei 2004-11-03
  • 打赏
  • 举报
回复
你的代码不完整
==================
int main(int argc, char* argv[])
{
Message myMessage;

if(argc != 2)
{
cout << "usage: " << argv[0] << ".exe -d or -e" << endl;
return 0;
}

if( !strcmp(argv[1], "-d"))
{
myMessage.getMessage();
myMessage.getKey();
myMessage.decryptMessage();
}


怎么这里就完了?
yegaofei 2004-11-03
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])函数

程序的入口点呀

致命错误一般都跟指针有关,再仔细看看
dragonzxh 2004-11-03
  • 打赏
  • 举报
回复
命令行参数啊

帮助理解:

int main(int argc,char *argv[])
{
int count=0;
while(count<argc)
{
cout<<"arg"<<count<<":"<<argv[count]<<endl;
count++;
}
}
运行结果:
c>test aoir oir oiud
arg0:test
arg1:aoir
arg2:oir
arg3:oiud
Flood1984 2004-11-03
  • 打赏
  • 举报
回复
检查一下指针的指向是否明确(有没有没初始化的或者访问了NULL指针所指的成员)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧