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

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函数有错误。。
请帮忙看一看。
...全文
134 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;
的位置并没关系,有关系的是你没给他们分配内存。
不知道程序是什么用的,编译没错了
基于LOS算法+反步控制的水下航行器AUVUUV三维路径跟踪控制研究(Matlab代码实现)内容概要:本文研究基于LOS(Line-of-Sight)算法与反步控制相结合的水下航行器(AUV/UUV)三维路径跟踪控制方法,并提供了完整的Matlab代码实现。通过构建水下航行器的动力学模型,结合LOS导引策略实现路径跟踪,利用反步控制方法设计控制器以保证系统稳定性与跟踪精度,有效应对海洋环境中的外部干扰与模型不确定性。文中详细阐述了控制算法的设计过程、稳定性分析及仿真验证,展示了在复杂三维路径下的良好跟踪性能。; 适合人群:具备自动控制理论、非线性控制基础及Matlab/Simulink仿真能力的研究生、科研人员及从事水下机器人控制开发的工程技术人员。; 使用场景及目标:①用于水下无人航行器路径跟踪控制系统的算法设计与仿真验证;②学习LOS导引法与反步控制在非线性系统中的综合应用;③为海洋机器人运动控制、自动驾驶等领域提供技术参考与代码实现模板。; 阅读建议:建议结合控制理论基础知识,逐步理解LOS算法的几何原理与反步控制的递推设计思想,重点分析Lyapunov稳定性证明过程,并通过Matlab代码调试与仿真实验加深对算法性能的理解。

70,036

社区成员

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

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