求帮忙看一下这个这段小程序:变量定义的位置不一样为什么会错误?

zhouweiwansui 2004-11-21 01:11:39
//转换16进制为字符串
void hex2str(char* str,int length,char* ret)
{
char *endptr;
char ch16[2] ;
char ch;
int i,j=0;
char re[length] ;
long lnumber;
memset(re,'\0',sizeof(re));
for (i=0;i<strlen(str);i+=2){
ch16[0] = *(str+i);
ch16[1]=*(str+i+1);
ch16[2]='\0';
lnumber = strtol(ch16, &endptr, 16);
ch = (int)lnumber;
re[j++] = ch;
}
re[j]='\0';
strcpy(ret , re);
}

int main(void)
{ char *str ;
char* pp; //这里奇怪,这样执行会错误
char* re;
//要是pp定义在*re后面则正常
strcpy(str,"d6dccea7");
hex2str(str,strlen(str),re);
return 0;
}

估计是hex2str函数有错误。。
请帮忙看一看。
...全文
108 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
choujs 2004-11-21
  • 打赏
  • 举报
回复

char ch16[2] ; 改为 char ch16[3] ;先,否则栈中就先错了。
koskinen 2004-11-21
  • 打赏
  • 举报
回复
void hex2str(char* str,int length,char* ret)
{
char *endptr;
char ch16[2] ;
char ch;
int i,j=0;
char *re=new char[length];
long lnumber;
memset(re,'\0',sizeof(re));
for(i=0;i<strlen(str);i+=2){
ch16[0] = *(str+i);
ch16[1]=*(str+i+1);
ch16[2]='\0';
lnumber = strtol(ch16, &endptr, 16);
ch = (int)lnumber;
re[j++] = ch;
}
re[j]='\0';
strcpy(ret , re);
}

int main(void)
{ char* str = new char[256];
strcpy(str,"d6dccea7");
//char* pp; //这里奇怪,这样执行会错误
char* re = new char[strlen(str)];

//要是pp定义在*re后面则正常

hex2str(str,strlen(str),re);
return 0;
}
goodluckyxl 2004-11-21
  • 打赏
  • 举报
回复
//你错误已经比较多了 我没办法原题修改了 只能照你的样子帮你重写
1.定义pp的地方是不会出错的 不会因为换个位置就正常了的
2.strcpy(str,"d6dccea7");//str未分配空间你字符拷贝是会有问题的
3.char re[length] ; //这样定义数组据说最新的c99支持但是一般的编译是不支持的建议动态分配
4.局部变量需要初始化
程序如下

void hex2str(char* str,int length,char* &ret)
{
char temp = 0 ;
int i,j=0;

ret = (char*) malloc( (length+1)/2*sizeof(char) );
memset( ret, 0, (length+1)/2 );
for ( i = 0; i < strlen(str); i++ )
{
if( str[i] >= 'A' && str[i] <= 'Z' )
temp = str[i] - 'A' + 10;
else if( str[i] >= 'a' && str[i] <= 'z' )
temp = str[i] - 'a' + 10;
else if( str[i] >= '0' && str[i] <= '9' )
temp = str[i] - '0';
else
{
free(ret);
return;
}

if(i%2)
ret[i/2] = ret[i/2]<<4 | temp;
else
ret[i/2] = temp;
}
}

int main(void)
{ char *str = "d6dccea7";
char* re = 0;
int i_show = 0;
hex2str( str, strlen(str), re);
for( int i = 0; i < (strlen(str)+1)/2; i++ )
printf( "%x ", (unsigned char)re[i] ); //测试
free(re);
return 0;
}
zhouweiwansui 2004-11-21
  • 打赏
  • 举报
回复
谢谢两位,我再检查一下
avalonBBS 2004-11-21
  • 打赏
  • 举报
回复
改了,能通过编译,但你的算法肯定有问题,下面加斜杠的都是我改的地方,好多丫~~~
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void hex2str(char* str,int length,char* ret)
{
////转换16进制为字符串
char *endptr;
char ch16[3] ;
char ch;
int i,j=0;
char *re=NULL; //char re[length] ; /////晕咯
long lnumber;
re= (char *)malloc(sizeof(char) * length);
memset(re,'\0',length); /////////////
for (i=0;i<length;i+=2){ //for (i=0;i<strlen(str);i+=2)<----用length不好吗??
ch16[0] =*(str+i);
ch16[1] =*(str+i+1);
ch16[2] ='\0'; //晕《-------------我将上面的改为了char ch16[3]
lnumber = strtol(ch16, &endptr, 16);
ch = (int)lnumber;
re[j++] = ch;
}
re[j]='\0';
strcpy(ret,re);
}

int main(void)
{
char str[]="d6dccea7"; //你原来的是用指针,但你忘记了要分配空间:(
char re[1000];
//要是pp定义在*re后面则正常
hex2str(str,strlen(str),re);
return 0;
}
languagec 2004-11-21
  • 打赏
  • 举报
回复
char* hex2str(char* str,int length,char* ret)
{
char *endptr;
char ch16[2] ;
char ch;
long lnumber;
int i,j=0;
char *re ;
re=(char *)malloc(length);
memset(re,'\0',sizeof(re));
for (i=0;i<strlen(str);i+=2){
ch16[0] = *(str+i);
ch16[1]=*(str+i+1);
ch16[2]='\0';
lnumber = strtol(ch16, &endptr, 16);
ch = (int)lnumber;
re[j++] = ch;
}
re[j]='\0';
/*strcpy(ret , re);*/
ret=re;
return ret;
}

int main(void)
{ char *str="dbdccea7" ;
char* pp;
char* re;
/* strcpy(str,"d6dccea7"); */
printf("%s\n",hex2str(str,strlen(str),re));
return 0;
}
------------------------------------------------------------
char* pp;
char* re;
的位置并没关系,有关系的是你没给他们分配内存。
不知道程序是什么用的,编译没错了

69,336

社区成员

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

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