编译器不同引起的错误?如何解决?

imjoksky 2003-10-20 02:38:00
一个加解密的简单问题,编程如下:
#include <iostream>
#include <stdlib.h>
using namespace std;

int pswd[]={4,9,6,2,8,7,3};
int keyLen=sizeof(pswd)/sizeof(int);

char* jiami(char* str);
char* jiemi(char* str);

int main(){
char* s="the result of 3 and 2 is not 8";
cout<<"\n原文:"<<s<<endl;

s=jiami(s);
cout<<"\n密文:"<<s<<endl;

s=jiemi(s);
cout<<"\n解密后:"<<s<<endl;

system("pause");
return 0;
}

char* jiami(char* str){
char* p=str;
int i=0;
while(*p){
*p+=pswd[i];
if(*p>122) *p%=122;
*p++;
i=(i+1)%keyLen;
}
*p='\0';
return str;
}

char* jiemi(char* str){
char* p=str;
int i=0;
while(*p){
*p-=pswd[i];
if(*p<32) *p=(*p+122);
*p++;
i=(i+1)%keyLen;
}
*p='\0';
return str;
}

在VC++6.0和DEV-C++5(4.9.8.0)上编译均能通过,VC6编译的东东运行无误,但DEV-C++编译的运行到*P+=PSWD[I]时崩溃,将该句换成(INT *)P+=PSWD[I]后这句能运行,但到*P='\0'这里又崩溃.

请哪位高手帮忙释疑,不胜感激.
...全文
81 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
imjoksky 2003-10-20
  • 打赏
  • 举报
回复
多谢两位,准备结帖了.
另:上面的程序在VC++5.0中编译通过,运行也通过,没什么问题.提问时错写成了6.0,不好意思,手头没有6.0,所以无从验证.
再次谢谢
fierygnu 2003-10-20
  • 打赏
  • 举报
回复
1、编译器无法知道,就象数组越界访问无法检测一样,这是C语言的指针灵活性导致的,只有程序员自己注意。
2、char* s="..."是定义了一个指针,指向了字符常量。char s[] = "..."是定义了一个字符数组,用"..."初始化,s自己在栈里。

看TCPL,也可以看C FAQ。
daizh 2003-10-20
  • 打赏
  • 举报
回复
你上面的程序在vc++6.0也应该无法运行,因为你对s所指向的内容进行修改,而通过下面的定义:
char* s="the result of 3 and 2 is not 8";
s指针指向的时data的const内存(字符串常量是存放在data的const内存),因而你不能对改变s指针所指向的内容。
imjoksky 2003-10-20
  • 打赏
  • 举报
回复
多谢楼上的答复,修改后还要再定义一个指针才能传递到函数中去,运行无误了,谢谢.

再问:
1.既然GCC编译器里常量字符串不能修改,那编译时为什么不报错呢?纳闷ING
2.用CHAR* S="......."定义的就变成常量了吗?(不好意思,刚学C++,很多基础的东东不会,又没什么资料可看)

fierygnu 2003-10-20
  • 打赏
  • 举报
回复
gcc编译器里,常量字符串不能修改。用
char s[]="the result of 3 and 2 is not 8";

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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