strtok用法 08.12.03

strtok用法

调用方式:char *strtok(char *str1,char *str2);  
功能说明:函数strtok()返回字符串str1中指向一个由str2所指定的字符或者字符串的分隔符的指针,当没有要返回的分隔符时,就返回一个空指针。 
  
函数strtok()实际上修改了有str1指向的字符串。每次找到一个分隔符后,一个空(NULL)就被放到分隔符处,函数用这种方法来连续查找该字符串。 
  
  例子1: 
  #include <string.h> 
  #include <stdio.h> 
  
  int main( int argc, char *argv[] ) 
  {  
     char *p;  
     char str[100]="This is a test,and you can use it";  
     p = strtok(str," "); // 注意,此时得到的   p为指向字符串:"This",即在第一个分隔符前面的字符串,即每次找到一个分隔符后,一个空(NULL)就被放到分隔符处,所以此时NULL指针指向后面的字符串:"is   a   test   ,and   you   can   use   it"。  
           
     printf("%s/n",p); //此时显示:This  
     do  
     {  
        p = strtok(NULL, ","); //NULL即为上面返回的指针,即字符串:"is a test ,and you can use it"。  
        if(p)  
           printf("%s/n",p);  
     }while(p);   
         
     return 1; 
  }   

  例子2: 
  #include <string.h>
  #include <stdio.h>

  char string[] = "A string/tof ,,tokens/nand some  more tokens";
  char seps[]   = " ,/t/n";
  char *token;

  void main( void )
  {
   printf( "%s/n/nTokens:/n", string );
   /* Establish string and get the first token: */
   token = strtok( string, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s/n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
  }


  例子2 Output

  A string   of ,,tokens
  and some  more tokens

  Tokens:
   A
   string
   of
   tokens
   and
   some
   more
   tokens

 

  例子3:

 CString strTest = "123 45";

 
//some other code

 CString strTest2 = strTest;
 
char seps[] = " "
;
 
char* pToken = 0
;
 
//char* pStr = strTest2.GetBuffer(0);

 pToken = strtok((char*)(LPCTSTR)strTest2, seps);
 //pToken = strtok(pStr, seps);
 
while
(pToken)
   pToken 
=
 strtok(NULL, seps);
  //strTest2.ReleaseBuffer(0);

说明:

运行上面的代码,可以看到strTest的值也变了,呵呵,这就是程序中一些关与CString的奇怪问题的起源.如果用注释中的GetBuffer/ReleaseBuffer方法,就一点问题也没有了.
同样,对于ReleaseBuffer的参数,缺省的是-1,但是我不建议.因为-1表示使用当前的00结束符位置来确定新的长度.而上面的例子中,strtok是会重新设置00结束符的,所以,安全的做法,就是把这个CString的长度设为0,ReleaseBuffer(0),反正它的内容已经变了,也没有人要用了.
说明一下,GetBuffer/ReleaseBuffer方法只能保证strTest不变,strTest2还是会变的.所以,对于一个成员变量,比如m_strTest2调用ReleaseBuffer要多一个心眼,局部变量就不用想这么多了.
那么怎么从最开始就意识到程序写错了呢?上面代码中
(char*)(LPCTSTR)是很危险的,把const去掉了,否则strtok是编译不过的,也从一个侧面说明了const的重要性.

  例子4:

CString str( "123 45" );
CString resToken;

int curPos= 0;
while (curPos != -1)
{
resToken= str.Tokenize(" ", curPos);
cout << (LPCTSTR)resToken << endl;
};

说明:

VC6的CString是没有Tokenize这个函数的,VC7的MFC中的CString才有。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值