int ClfKillDlg::split(LPTSTR part[], int MAX, LPCTSTR Source, LPCTSTR Delimit)
{
int nCount = 0;
CString strFullString(Source);
//LPTSTR *temp = part ;
   
part[nCount] = strtok(strFullString.GetBuffer (strFullString.GetLength ()),Delimit);
strFullString.ReleaseBuffer ();
while((part[nCount++] ) && nCount<MAX )
{

part[nCount] = strtok(NULL,Delimit);

} return nCount;
}
我这样子调用:
LPTSTR path[10];
split(&path[0],10,finder.GetFilePath(),"\\");但是有点不点哦。我需要的path[10],字串数组,没有被赋值啊。请问我要怎么传值?还是我函数不对?
我最开始,是想传个CString [],过去。但是不总是做不好~~望指教。。

解决方案 »

  1.   

    split(path,10,finder.GetFilePath(),"\\");
      

  2.   

    split(path,10,finder.GetFilePath(),"\\");这样试过的。。我一开始就是这样做的
      

  3.   

    是不是while((part[nCount++] ) && nCount<MAX )有问题,只需要while(nCount < MAX)就可以了吧!前面的条件似乎永远为FALSE!因为你使用char* path[10]定义指针数组时,数组中的每个地址都为随机数!为安全起见,最好这样使用!LPTSTR path[10];
    ZeroMemory(path, 10 * sizeof(LPTSTR));然后将while((part[nCount++] ) && nCount<MAX )改成while(nCount < MAX)试试看!
      

  4.   

    即:
    while(nCount<MAX )
    {

    part[nCount++] = strtok(NULL,Delimit);

    }
      

  5.   

    因为你使用char* path[10]定义指针数组时,数组中的每个地址都为随机数?????没听说过啊。。path[0],和path[1]地址不是连续的?我的最大问题是,在函数里面,path可以得到我需要的值,只是传不回去。。我看不是jack说的问题吧
      

  6.   

    “path[0],和path[1]地址不是连续的?”当然不是连续的!
    path时LPTSTR数组!右不是char数组!我总感觉你已经把ClfKillDlg::split(LPTSTR part[], )中的part当作char数组了!但是事实上它却是char*数组!你使用while(part[nCount++] && ..)来判断什么啊?
      

  7.   

    另外,part中存放的是一系列地址,也就是说part里存的都是一些32位的整形数字!
    从另外一种觉得你可以将part看这是一个int数组!
      

  8.   

    呵呵。我把part[nCount++]当一个字符串了。我每个part[n],不能当做一个串吗?
      

  9.   

    对了,我仔细想了想,你的代码还有个问题,就是使用了局部变量
    CString strFullString(Source);
    因为strtok会改变它所要“分段”的字符串!但里的part数组中存放的也是这个字符串中的相应的地址!
    但是strFullString为栈上的变量,在函数结束时strFullString所占用的内存被自动释放了!也就是说已经分好段的字符串不存在了!所以,最好将
    int ClfKillDlg::split(LPTSTR part[], int MAX, LPCTSTR Source, LPCTSTR Delimit)
    改成
    int ClfKillDlg::split(LPTSTR part[], int MAX, LPTSTR Source, LPCTSTR Delimit)
    即让split改变Source字符串!
    你只要在调用split之前“备份”Source就可以了!下面是我的一段代码:
    int _split(LPSTR part[], int nCount, LPSTR szSource, LPCSTR szDelimit)
    { LPSTR pstr;
    int i = 0, len = 0;
    pstr = strtok(szSource, szDelimit);
    while (i < nCount)
    { part[i] = pstr;
    printf(">>%d %s\n", part[i], part[i]);
    i++;
    pstr = strtok(NULL, szDelimit);
    }
    return i;
    }调用:
    char szPathBuff[MAX_PATH];
    LPSTR part[5];
    GetCurrentDirectory(MAX_PATH, szPathBuff);
    _split(part, 5, szPathBuff, "\\"); // szPathBuff 字符串将会被_split更改! for(int i = 0; i < 5; i++)
    printf("%d %s\n",part[i], (char*)part[i]);
      

  10.   

    要注意strtok这个特殊的函数!!!!
    Each call to strtok modifies strToken by inserting a null character after the token returned by that call