一个非常神奇的问题

llxiaogenbanga 2010-05-04 03:42:21

#include "stdafx.h"
int CStringSplit(CString strs, CString sp,CStringArray &sitem)
{
int istar;
int iend,ilast;
istar=0;
ilast=0;
for(int i=0;;i++)
{
iend=strs.Find(sp,istar);
if(strs.Find(sp,istar)==-1)
{
sitem.Add(strs.Right(strs.GetLength()-ilast));
break;
}
sitem.Add(strs.Mid(istar,iend-istar));
ilast=iend+sp.GetLength();
istar=iend+sp.GetLength();
}
return 0;
}
void GET2(char*& rarr)
{
char* arr1="abcdefghijklmnopqrstuvwxyz";
char arr2[2000]={0};
for(int j=0;j<strlen(arr1);j++)
{
arr2[j]=arr1[j];
}
rarr=&arr2[0];
}
void GET1(char*& rchar)
{
CStringArray arrfff;CStringSplit("aba","a",arrfff);//加了这一句main输出乱码,不加这句,输出正常,
GET2(rchar);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* gchar;
GET1(gchar);
printf(gchar);
return 0;
}



...全文
154 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
13880079673 2010-05-04
  • 打赏
  • 举报
回复
这个自己写一下吧,我这儿也没现成的,原来写了个解析xml的函数给你这个功能差不多,里面计算偏移量这些挺费时间的。

bool GetXmlNode(const char* xml,const char* node,char* result)
{
char starnode[30]={0};
char endnode[30]={0};
sprintf(starnode,"<%s>", node);
sprintf(endnode, "</%s>", node);
char * starchar=strstr((LPTSTR)xml,starnode);
if(starchar != NULL)
{
starchar += strlen(starnode);
char * endchar=strstr(starchar,endnode);
if(endchar != NULL)
{
memcpy(result,starchar,endchar-starchar);
result[endchar-starchar] = '\0';
}
else
{
return false;
}
}
else
{
return false;
}
return true;
}


这个应该比较容易改成你想要的
klkvc386 2010-05-04
  • 打赏
  • 举报
回复
Up..........
element_cn 2010-05-04
  • 打赏
  • 举报
回复
我运行没有问题
llxiaogenbanga 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 13880079673 的回复:]

CStringSplit这个函数建议不要使用CString,效率太低,全部改成char *,查找使用strstr,速度会快很多,特别是需要反复循环这个函数的时候,性能影响特别大
[/Quote]

能提供个好的 Split吗
13880079673 2010-05-04
  • 打赏
  • 举报
回复
CStringSplit这个函数建议不要使用CString,效率太低,全部改成char *,查找使用strstr,速度会快很多,特别是需要反复循环这个函数的时候,性能影响特别大
13880079673 2010-05-04
  • 打赏
  • 举报
回复
楼主是该多看看书,要不然这些基础问题写程序的时候能把你折磨死
13880079673 2010-05-04
  • 打赏
  • 举报
回复
上面的修改是
char arr2[2000]={0};
改为
char* arr2=new char[2000];
memset(arr2,0,2000);

main函数最后加上
if(gchar != NULL)
{
delete gchar;
}

llxiaogenbanga 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 13880079673 的回复:]

#include "stdafx.h"
#include <afx.h>

int CStringSplit(CString strs, CString sp,CStringArray &sitem)
{
int istar;
int iend,ilast;
istar=0;
ilast=0;
for(int i=0;;i++)
{
iend=strs.Find(s……
[/Quote]
基础太差了,求侮辱~
13880079673 2010-05-04
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <afx.h>

int CStringSplit(CString strs, CString sp,CStringArray &sitem)
{
int istar;
int iend,ilast;
istar=0;
ilast=0;
for(int i=0;;i++)
{
iend=strs.Find(sp,istar);
if(strs.Find(sp,istar)==-1)
{
sitem.Add(strs.Right(strs.GetLength()-ilast));
break;
}
sitem.Add(strs.Mid(istar,iend-istar));
ilast=iend+sp.GetLength();
istar=iend+sp.GetLength();
}
return 0;
}
void GET2(char*& rarr)
{
char* arr1="abcdefghijklmnopqrstuvwxyz";
char * arr2=new char[2000];
memset(arr2,0,2000);
for(int j=0;j<strlen(arr1);j++)
{
arr2[j]=arr1[j];
}
rarr=&arr2[0];
}
void GET1(char*& rchar)
{
CStringArray arrfff;CStringSplit("aba","a",arrfff);//加了这一句main输出乱码,不加这句,输出正常,
GET2(rchar);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* gchar=NULL;
GET1(gchar);
printf(gchar);
if(gchar != NULL)
{
delete gchar;
}
return 0;
}
楼主你的错误是把函数的局部变量(分配在栈区,系统在生命周期结束自动回收)的生命周期搞错了,arr2的生命周期只在函数内部,出了函数,他原分配的空间就可以被改写,所以在GET1中虽然能够引用到地址,但是他的内容却变成不可预知的了,所以加了那个CString的操作,后台可能进行了一些优化处理,导致其指向的内容被arrfff占用,所以应该改为把arr2分配在堆上,再你使用后再手动释放就可以了
llxiaogenbanga 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 firebirdcn 的回复:]

灵异

调整顺序看下
CStringArray arrfff;CStringSplit("aba","a",arrfff);//加了这一句main输出乱码,不加这句,输出正常,
GET2(rchar);
[/Quote]
这个不行,因为要在前面分割字符,

等待高手出现
FireBirdCN 2010-05-04
  • 打赏
  • 举报
回复
灵异

调整顺序看下
CStringArray arrfff;CStringSplit("aba","a",arrfff);//加了这一句main输出乱码,不加这句,输出正常,
GET2(rchar);
llxiaogenbanga 2010-05-04
  • 打赏
  • 举报
回复

CStringArray arrfff;CStringSplit("aba","a",arrfff);/
这句变量都是重新定义的
qjipa 2010-05-04
  • 打赏
  • 举报
回复
可能这一句执行时覆盖了rchar变量的数据吧,其实出现乱码的时候应该就有可能内存错误的了
jyh_baoding 2010-05-04
  • 打赏
  • 举报
回复
不明白你的意思,帮顶
llxiaogenbanga 2010-05-04
  • 打赏
  • 举报
回复

CStringArray arrfff;CStringSplit("aba","a",arrfff);
这句与其他代码没联系啊
很神奇吧

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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