使用strtok_s函数从一个字符串中分离出单词下面的代码从含有多个结束符的字符串中分离出单词来,需要对strtok_s有清楚的认识。1234567891011121314151617181920212223242526272829303132333435363738394041424344454647voidParseBuffer(CWordCounter*pCounter,CWordBuffer*buf){char*strSrc=buf-m_buff;//缓冲块首地址char*strDelim=\r\t\n;//缓冲块中单词之间的分隔符char*strToken=NULL;//指向将被处理的单词char*next_token=NULL;//保存缓冲块中下一个将被读取的单词的位置stringstr;//保存分离出来的单词intnWordTotalInBytes=buf-m_nWordLengthInBytes;//需要被处理的单词总字节数strToken=strtok_s(strSrc,strDelim,&next_token);while(1){while(NULL!=strToken){str.assign(strToken);pCounter-InsertItem(str);strToken=strtok_s(NULL,strDelim,&next_token);}//退出循环表示该部分单词分析的时候遇到了NULL结束符,继续分离缓冲块中剩下的字符if((next_token+2)(strSrc+nWordTotalInBytes))//这里最好自己用笔画一下,不然很容易出错!{//移动位置超过了最后一个有效字符break;}//移动到下一个开始扫描的字符while(((next_token+1)(strSrc+nWordTotalInBytes))//没有超过最后一个有效字符&&!sw::IsLetter(*next_token)){++next_token;//++nWordProcessedInBytes;}if((next_token+2)(strSrc+nWordTotalInBytes)){//移动位置超过了最后一个有效字符break;}strToken=strtok_s(next_token,strDelim,&next_token);if((next_token+2)(strSrc+nWordTotalInBytes)||(NULL==strToken)){//移动位置超过了最后一个有效字符,或者位置内容为nullbreak;}}}在设置过滤字符的时候注意下(这是我在实际中犯的错误),在过滤文本中的字符时最好加上:'\r'(回车)!