又是小字符串问题,权当散分!

shuangling 2004-04-22 01:55:08
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]);


我知道我写的好乱,呵呵
大家帮忙哦
...全文
36 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuangling 2004-04-23
  • 打赏
  • 举报
回复
现在我这样做了,
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
pomelowu 2004-04-22
  • 打赏
  • 举报
回复
就是最后这段代码了阿。循环的问题解决了,也是动态的。你反正都用到了CString,我就干脆全用CString来做了。你自己可以改为char数组来做的啊。还有什么疑问吗?
shuangling 2004-04-22
  • 打赏
  • 举报
回复
up
pomelowu 2004-04-22
  • 打赏
  • 举报
回复
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();
}
pomelowu 2004-04-22
  • 打赏
  • 举报
回复
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();
}
pomelowu 2004-04-22
  • 打赏
  • 举报
回复
呵呵~~反了一点小错误
str = str.Right(str.GetLength() - str.Find(' ') - 1);

try again
shuangling 2004-04-22
  • 打赏
  • 举报
回复
一:Read[i] = (char *)temp;-》sscanf(temp,"%s",&Read[i]);
二:str = str.Right(str.Find(' '));
-》str = str.Right(str.GetLength()-str.Find(' '));
三:while (!str.IsEmpty())
一直为真

第三个不知道怎么办

其实我想用动态的声明,
pomelowu 2004-04-22
  • 打赏
  • 举报
回复
这跟你的Read的声明可能有关的。你先声明一个足够大的二维字符数组(比如char Read [100][100];)试试我的那段代码,应该没有问题。
但是如果你要动态的数组大小的话,就要多费点功夫了
还有就是CString可以强制转换为char *类型的,没问题。
shuangling 2004-04-22
  • 打赏
  • 举报
回复
pomelowu(羽战士)的方法

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

谢谢大家
pomelowu 2004-04-22
  • 打赏
  • 举报
回复
或者干脆用CArray模板CObList类来处理,这个楼主自己想想吧:)
QunKangLi 2004-04-22
  • 打赏
  • 举报
回复
要么全用_tcs打头的,要么全用str打头的.上面就是混用了,55555
QunKangLi 2004-04-22
  • 打赏
  • 举报
回复
一时笔误,应该是:_tcstok():
int ReadStr( char *abc[], CString str )
{
TCHAR string[1024] ;
_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 = _tcstok( NULL, seps );
}
return i ;
}
pomelowu 2004-04-22
  • 打赏
  • 举报
回复
修改一下代码

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的数组指针或者儿重指针
jennifergiant 2004-04-22
  • 打赏
  • 举报
回复
pomelowu(羽战士)的方法就可以了
shuangling 2004-04-22
  • 打赏
  • 举报
回复
谢谢李大哥

我要的是

abc 作一个串,sdjh也作一个串等等,存在一个数组中
而不是把中间的空格去了
你的上一个程序,没有报错,但到 token = strtok( NULL, seps );
就断了
QunKangLi 2004-04-22
  • 打赏
  • 举报
回复
好像有个小BUG:
TCHAR *string = new TCHAR( sizeof(TCHAR)*(str.GetLength() + 1 ) ) ;
QunKangLi 2004-04-22
  • 打赏
  • 举报
回复
CString str(" abc sdjh s he wei e s sss asdf ");
str.Replace( " ", "" ); 的结果是:
str == "abcsdjhsheweiessssasdf"
QunKangLi 2004-04-22
  • 打赏
  • 举报
回复
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] ;
}
pomelowu 2004-04-22
  • 打赏
  • 举报
回复
注意你的Read声明有误
pomelowu 2004-04-22
  • 打赏
  • 举报
回复
知道楼主的意思了
这样来:
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();
}
加载更多回复(9)

16,472

社区成员

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

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

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