CString str("   abc   sdjh s he  wei e s  sss asdf ");
把这个字符串中的abc呀那些都提起!
可以存到 char Read[]中void ReadStr(char Read[],CString str)
{
memset(Read,0,sizeof(Read));
int j = 0;
if(str.GetLength() == 0)
return;
for(int i = 0;i<str.GetLength();++i)
{
if(str.GetAt(i) == 32)
{
strcpy(&Read[j],str.Left(i));
TRACE("%s\n",&Read[j]);
j++;
for(int p = 0;p<str.GetLength();++p)
{
   int k = i+1;
   if(str.GetAt(k) == 32)
      str = str.Right(str.GetLength()-1);
   else
       break;
   k++;
}
str = str.Right(str.GetLength()-i-1);
i = 0;
}
}
strcpy(&Read[j+1],str);
TRACE("%s\n",&Read[j+1]);
}我单个的TRACE都是正确的而在最后一行,TRACE("%s\n",&Read[j+1]);
后面再来打前面的就不可以了TRACE("%s\n",&Read[0]);
我知道我写的好乱,呵呵
大家帮忙哦

解决方案 »

  1.   

    怀疑:1:read数租越界,2:read字符串没有空终止符,或者在read[j+1]之前
      

  2.   

    不管我的程序有没有错
    我不想去想了 我现在想要一个程序:
    CString str("   abc   sdjh s he  wei e s  sss asdf ");
    把这个字符串中的abc呀那些都提起!
    可以存到 char Read[]中
    (不管他们中间有多少个空格)大家能不能给我一个程序!!!!!!!!!!!!!!!!!!!!!!!!!!!分不够就加
      

  3.   

    简化方案:
    void ReadStr(TCHAR Read[],CString str)
    {
    str.Replace( " ", "" ) ;
    memset( Read, 0, sizeof(Read) ) ;
    _tcsncpy( Read, str ) ;
    }
      

  4.   

    参数少了一个:
    void ReadStr(TCHAR Read[],CString str)
    {
    str.Replace( " ", "" ) ;
    memset( Read, 0, sizeof(Read) ) ;
    _tcsncpy( Read, str, sizeof(Read)/sizeof(TCHAR) - 1 ) ;//第三参数是缓冲区允许的字符数.
    }
      

  5.   

    不好意思,还有错误.
    sizeof(Read)得到的是指针的大小而不是缓冲区的大小.可以用_tcscpy不管大小直接复制,但有访问违规的可能性.或在参数中指定缓冲区可存字符数:
    void ReadStr(TCHAR Read[], int nLen, CString str)
    {
    str.Replace( " ", "" ) ;
    memset( Read, 0, sizeof(Read) ) ;
    _tcsncpy( Read, str, nLen ) ;
    }
      

  6.   

    你要的是去掉str中所有的空格,然后存到Read[]中?
    Read = (char *)(str.Remove(' '));
      

  7.   

    呵呵
    谢谢楼上的
    我可能少说了一点
    我想的是
    char Read[0] 存 abc;
    char Read[1] 存 sdjh;
    char Read[2] 存 sh;
    char Read[3] 存 e; ........
    而不是“abcsdjh...”这样一个个的提起来
    我不能输入一个长度,因为长度是不定的,我是可以得到str长度
    其实我是以空格为标识来读取的,
    可能得到read数组长度为2,也可能为12
    呵呵
      

  8.   

    To QunKangLi(李群康) 
    str.Replace( " ", "" ) ;的结果应该会让str变成
    "\0\0\0abc\0\0\0sdjh\0s\0he\0\0wei\0e\0s\0\0sss\0asdf\0"
    吧?是不是应该
    str.Replace( " ", NULL);
    还是两者没有区别?
      

  9.   

    知道楼主的意思了
    这样来:
    int i=0
    str.TrimLeft();
    str.TrimRight();
    while (!str.IsEmpty())
    {
    CString temp = str.Left(str.Find(' '));
    Read[i] = (char *)temp;
    i++;
    str = str.Right(str.Find(' '));
    str.TrimLeft();
    str.TrimRight();
    }
      

  10.   

    void ReadStr( char *abc[], CString str ) 
    {
    TCHAR *string = new TCHAR( sizeof(TCHAR)*str.GetLength() ) ;
    _tcscpy( string, str ) ;
    TCHAR seps[]   = _T(" ,\t\n");//可能的中分隔符.如仅是空格,则删除其它的.
    LPTSTR token;   token = _tcstok( string, seps );
       int i = 0 ;
       while( token != NULL )
       {
      _tcscpy( abc[i++], token );
          TRACE( " %s\n", token );
          token = strtok( NULL, seps );
       }
    delete[] string ;
    }
    void TEST()
    {
    CString str("   abc   sdjh s he  wei e s  sss asdf ");
    TCHAR *aaa[10] ;
    for( int i = 0 ; i < 10 ; ++ i )
    aaa[i] = new TCHAR[128] ;
    ReadStr( aaa, str ) ;
    for( int i = 0 ; i < 10 ; ++ i )
    delete[] aaa[i] ;
    }
      

  11.   

    CString str("   abc   sdjh s he  wei e s  sss asdf ");
    str.Replace( " ", "" ); 的结果是:
    str == "abcsdjhsheweiessssasdf"
      

  12.   

    好像有个小BUG:
    TCHAR *string = new TCHAR( sizeof(TCHAR)*(str.GetLength() + 1 ) ) ;
      

  13.   

    谢谢李大哥

    我要的是abc 作一个串,sdjh也作一个串等等,存在一个数组中
    而不是把中间的空格去了
    你的上一个程序,没有报错,但到  token = strtok( NULL, seps );
    就断了
      

  14.   

    pomelowu(羽战士)的方法就可以了
      

  15.   

    修改一下代码int i=0
    str.TrimLeft();
    str.TrimRight();
    while (!str.IsEmpty())
    {
    CString temp = str.Left(str.Find(' '));
    Read[i] = (char *)temp;
    i++;
    str = str.Right(str.Find(' '));
    str.TrimLeft();
    }
    注意,Read要声明为char的数组指针或者儿重指针
      

  16.   

    一时笔误,应该是:_tcstok():
    int ReadStr( char *abc[], CString str ) 
    {
    TCHAR string[1024] ;
    _tcscpy( string, str ) ;
    TCHAR seps[]   = _T(" ,\t\n");//&iquest;&Eacute;&Auml;&Uuml;&micro;&Auml;&Ouml;&ETH;·&Ouml;&cedil;&ocirc;·&ucirc;.&Egrave;&ccedil;&frac12;&ouml;&Ecirc;&Ccedil;&iquest;&Otilde;&cedil;&ntilde;,&Ocirc;ò&Eacute;&frac34;&sup3;&yacute;&AElig;&auml;&Euml;ü&micro;&Auml;.
    LPTSTR token;   token = _tcstok( string, seps );
       int i = 0 ;
       while( token != NULL )
       {
      _tcscpy( abc[i++], token );
          TRACE( " %s\n", token );
          token = _tcstok( NULL, seps );
       }
       return i ;
    }
      

  17.   

    要么全用_tcs打头的,要么全用str打头的.上面就是混用了,55555
      

  18.   

    或者干脆用CArray模板CObList类来处理,这个楼主自己想想吧:)
      

  19.   

    pomelowu(羽战士)的方法我改了一行:Read[i] = (char *)temp;-》sscanf(temp,"%s",&Read[i]);
    但,到str = str.Right(str.Find(' '));就有一点问题了
    呵呵
    我还在看看谢谢大家
      

  20.   

    这跟你的Read的声明可能有关的。你先声明一个足够大的二维字符数组(比如char Read [100][100];)试试我的那段代码,应该没有问题。
    但是如果你要动态的数组大小的话,就要多费点功夫了
    还有就是CString可以强制转换为char *类型的,没问题。
      

  21.   

    一:Read[i] = (char *)temp;-》sscanf(temp,"%s",&Read[i]);
    二:str = str.Right(str.Find(' '));
             -》str = str.Right(str.GetLength()-str.Find(' '));
    三:while (!str.IsEmpty())
       一直为真第三个不知道怎么办其实我想用动态的声明,
      

  22.   

    呵呵~~反了一点小错误
    str = str.Right(str.GetLength() - str.Find(' ') - 1);try again
      

  23.   

    int i = 0, j = 0;
    str.TrimLeft();
    str.TrimRight();
    while (j != -1)
    {
    j = str.Find(' ');
    CString temp = str.Left(j);
    // Read[i] = (char *)temp;
    i++;
    if (j != -1)
    str = str.Right(str.GetLength() - j -1);
    str.TrimLeft();
    }
      

  24.   

    CArray <CString, CString> Read;
    int i = 0, j = 0;
    str.TrimLeft();
    str.TrimRight();
    while (j != -1)
    {
    j = str.Find(' ');
    CString temp = str.Left(j);
    Read.Add(temp);
    i++;
    if (j != -1)
    str = str.Right(str.GetLength() - j -1);
    str.TrimLeft();
    }
      

  25.   

    就是最后这段代码了阿。循环的问题解决了,也是动态的。你反正都用到了CString,我就干脆全用CString来做了。你自己可以改为char数组来做的啊。还有什么疑问吗?
      

  26.   

    现在我这样做了,
    void ReadStr(CString res[],CString str)
    {
    int index=0;
    if(str.IsEmpty()&&str.Find(' ')!=-1)
    ;
    else
    {
    for(int i=0;i<str.GetLength();i++)
    {
    if(str.GetAt(i)!=0x20)
    {
    for(int j=i;j<str.GetLength();j++)
    {
    if(str.GetAt(j)==0x20)
    {
    res[index]=str.Mid(i,j-i);
    i=j;
    index++;
    break;
    }
    }
    }
    }
    }
    }
    int main()
    {
    CString str(" abc def  ghi  jkl  123   ");
    CString res[20];    ReadStr(res,str);
    TRACE("%s\n",res[0]);
    TRACE("%s\n",res[1]);
    TRACE("%s\n",res[2]);
    return 0;
    }呵呵,效率不好
    但得到了谢谢大家
    结贴啦!!!!!!!!!!!!!!!!!!!!!!!!!!!!1