请帮我看看这个函数,如何释放内存?
//////////////////////////////////////////////////////////////////////////////////
// 函数名称:StrHexToChar(AnsiString StrHex)
// 函数功能:将16进制字符串转为CHAR字符 ( 例String"36" ->char "6" )
// 函数参数:AnsiString StrHex
// 函数返回:char * Chr
// 函数日期:2003.11.25
//////////////////////////////////////////////////////////////////////////////////
char * StrHexToChar(AnsiString StrHex)
{
AnsiString StrHex_1; // 取单个字符
int a10;
int yqw_Len = StrHex.Length();
char *yqw_tmp;
yqw_tmp = new char[yqw_Len/2];
for(int i=1; i<yqw_Len;i+=2)
{
StrHex_1 = "0x" + AnsiString(StrHex[i]) + AnsiString(StrHex[i+1]);
a10 = StrHex_1.ToIntDef(5); // 此处为什么要用5?应该用几?
yqw_tmp[i-1] = char(a10);
}
return yqw_tmp;
}
什么时候delete yqw_tmp呢?
问题点数:50、回复次数:21Top
1 楼wasoxi(我就是(没意思~~~))回复于 2004-04-04 16:49:41 得分 0
upTop
2 楼matq2008(叶子.net)回复于 2004-04-04 17:00:46 得分 10
应试显示删除的
Top
3 楼Persistent8813(固执的,坚持的:山东诸城)回复于 2004-04-04 17:05:34 得分 0
能不能说清楚些啊,老大Top
4 楼Persistent8813(固执的,坚持的:山东诸城)回复于 2004-04-04 17:16:39 得分 0
upTop
5 楼matq2008(叶子.net)回复于 2004-04-04 17:24:17 得分 0
我不喜欢这种自己申请但不删除的方式,你可以改为返回AnsiString
在最后用StrPas这个函数转换为AnsiString,然后删除它,再返回这个AnsiStringTop
6 楼matq2008(叶子.net)回复于 2004-04-04 17:28:03 得分 0
那个5是缺省值,指不能转换的字符缺省转为它吧Top
7 楼ArWen()回复于 2004-04-04 17:29:37 得分 10
同意楼上的.
不过楼主要是还要坚持用你的方式,则调用处负责删除就是了.
char * result = StrHexToChar("...");
... // 使用result
delete result;Top
8 楼Persistent8813(固执的,坚持的:山东诸城)回复于 2004-04-04 17:34:05 得分 0
楼上是什么意思啊?用result还不是一样?它又不是特殊的变量吧
叶子说的用String是不行的啊,你想,如果是'/0'怎么办?还是要用字串数组。Top
9 楼Persistent8813(固执的,坚持的:山东诸城)回复于 2004-04-04 17:36:42 得分 0
只能用ArWen() 的方式吗?那样不会有问题?从函数外删除?不会出问题?呵呵,试试了
如果不出问题也应该可以Top
10 楼JetKingLau(时差)(亦远亦近)(静坐常思已过 闲谈勿论人非 …………)回复于 2004-04-04 17:39:09 得分 10
这样吧,交由引用者自己解决。
char * StrHexToChar(AnsiString StrHex, char yqw_tmp[])
{
AnsiString StrHex_1; // 取单个字符
int a10;
int yqw_Len = StrHex.Length();
// char *yqw_tmp;
// yqw_tmp = new char[yqw_Len/2];
for(int i=1; i<yqw_Len;i+=2)
{
StrHex_1 = "0x" + AnsiString(StrHex[i]) + AnsiString(StrHex[i+1]);
a10 = StrHex_1.ToIntDef(5); // 此处为什么要用5?应该用几?
yqw_tmp[i-1] = char(a10);
}
return yqw_tmp;
}
Top
11 楼Persistent8813(固执的,坚持的:山东诸城)回复于 2004-04-04 17:39:43 得分 0
但是总感觉不完美,其实要是能用不定长字串数组就能解决这个函数,可我不会啊Top
12 楼xiaoshi0(Rain)回复于 2004-04-05 09:37:46 得分 20
如果要做这样的函数,不能这么调用,因为这样的话,得不到正确的答案,如果想返回一个字符串,希望用传址的方式,或者引用的方式,现写一函数如下:
bool StrHexToChar(const AnsiString StrHex, char *yqw_tmp)
{
if(StrHex.IsEmpty())
{
return false;
}
if(yqw_tmp == NULL)
{
return false;
}
AnsiString StrHex_1;
int a10;
int yqw_Len = StrHex.Length();
for(int i = 1; i < yqw_Len; i += 2)
{
StrHex_1 = "0x" + AnsiString(StrHex[i]) + AnsiString(StrHex[i+1]);
a10 = StrHex_1.ToIntDef(5); //主要看你想默认是多少
yqw_tmp[i-1] = char(a10);
}
return true;
}
Top
13 楼Persistent8813(固执的,坚持的:山东诸城)回复于 2004-04-05 11:27:40 得分 0
发现一个大问题,此题是无解了,呵~~
本来是想将16进制格式的字串转成CHAR字符串,但如果中间有值被转成'\0'就还是不成其字符串。看来是没有办法了。唉Top
14 楼xiaoshi0(Rain)回复于 2004-04-05 11:48:01 得分 0
你的程序想干什么呀?告诉我功能,我帮你实现Top
15 楼Persistent8813(固执的,坚持的:山东诸城)回复于 2004-04-05 16:24:54 得分 0
TO小鱼儿:将16进制格式的字串转成CHAR字符串:'363534'->'654'.
有没有可以包含多个'\0'的字符串啊?可那样就不叫字符串了对吧?叫数组是没问题的。
用CHAR[]数组可以解决吗?用指针不行了?晕了啊Top
16 楼xiaoshi0(Rain)回复于 2004-04-05 17:21:18 得分 0
还是没明白你的意思,为什么要有多个'\0'呀?Top
17 楼Persistent8813(固执的,坚持的:山东诸城)回复于 2004-04-05 18:12:11 得分 0
因为要转的字串中不能排除有多个'\0'的可能啊Top
18 楼xiaoshi0(Rain)回复于 2004-04-06 09:20:13 得分 0
那样的话就必须分成多个字符串处理,处理完之后再合并到一起,因为有'\0'的话是永远不能用一个字符串表示的Top
19 楼limlzm(凡叶)回复于 2004-04-06 10:10:52 得分 0
看来再写多个函数负责释放,然后没用到就调用这个函数释放是唯一的方法了。了解Top
20 楼Persistent8813(固执的,坚持的:山东诸城)回复于 2004-04-06 13:59:18 得分 0
不使用字符串,只使用指针,解决。Top
21 楼xiaoshi0(Rain)回复于 2004-04-06 14:05:11 得分 0
呵呵,那样的话不使用的字符数组么!嘿嘿Top




