当前位置: 首页 > news >正文

使用strtok_s函数从一个字符串中分离出单词

下面的代码从含有多个结束符的字符串中分离出单词来,需要对strtok_s有清楚的认识。这段代码是我在写一个处理文件中单词个数时用来分离读取到的字符串中的单词时写的,亲测可用~

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void  ParseBuffer(CWordCounter *pCounter, CWordBuffer *buf)
{
     char  *strSrc = buf->m_buff;          //缓冲块首地址
     char  *strDelim = " \r\t\n" ;         //缓冲块中单词之间的分隔符
     char  *strToken = NULL;              //指向将被处理的单词
     char  *next_token = NULL;            //保存缓冲块中下一个将被读取的单词的位置
 
     string str;                         //保存分离出来的单词
     int  nWordTotalInBytes = 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))
         { //移动位置超过了最后一个有效字符,或者位置内容为null
             break ;
         }
     }
}

 

在设置过滤字符的时候注意下(这是我在实际中犯的错误),在过滤文本中的字符时最好加上:'\r'(回车)!

相关文章:

  • Android Studio_更新Gradle
  • MyBatis源码解读之SqlSession
  • 【小松教你手游开发】【系统模块开发】根据上一个GameObject坐标生成的tips界面...
  • 观察者模式在One Order回调函数中的应用
  • grep sed awk 练习题
  • #define与typedef区别
  • Linux下命令设置别名--alias(同实用于mac)
  • Eclipse/MyEclipse导入导出注释模板
  • 正则介绍以及grep
  • AI的故事:半人马的诞生之路
  • 共享单车引发秩序问题增多,政府正在研究相关管理办法
  • web后台过程
  • 0314-布局遇到的问题(山东理工大)
  • java多线程处理导入数据拆分List集合 同步处理插入数据
  • 1011. A+B和C (15)
  • 分享一款快速APP功能测试工具
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Android单元测试 - 几个重要问题
  • Android开源项目规范总结
  • C++类的相互关联
  • Create React App 使用
  • DataBase in Android
  • Docker容器管理
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java IO学习笔记一
  • JavaScript设计模式之工厂模式
  • October CMS - 快速入门 9 Images And Galleries
  • React Native移动开发实战-3-实现页面间的数据传递
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue UI框架库开发介绍
  • 翻译:Hystrix - How To Use
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 类orAPI - 收藏集 - 掘金
  • 十年未变!安全,谁之责?(下)
  • 用Python写一份独特的元宵节祝福
  • 1.Ext JS 建立web开发工程
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • Prometheus VS InfluxDB
  • 选择阿里云数据库HBase版十大理由
  • 组复制官方翻译九、Group Replication Technical Details
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ![CDATA[ ]] 是什么东东
  • #DBA杂记1
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #define与typedef区别
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .apk文件,IIS不支持下载解决
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .net core 连接数据库,通过数据库生成Modell
  • .NET MVC第五章、模型绑定获取表单数据