strtok用法 08.12.03

深入剖析strtok():从基础原理到线程安全实践 本文深入剖析strtok()函数的核心分割机制,揭示其静态变量带来的线程安全隐患,并介绍安全替代方案strtok_s与strtok_r。通过实际应用案例和性能优化技巧,帮助开发者避免常见陷阱,提升字符串处理的安全性和效率。 阅读详情
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才有。

 

C++_MFC_拆分字符串 我们应该注意到,没有一个受过伦理教育的软件工程师会同意开发出“摧毁巴格达”的程序。然而基本的职业道德却可以要求他们开发出“摧毁城市”的程序,巴格达只是这个程序的一个参数。 立即下载

相关推荐

AT91SAM9260搭建LINUX操作系统

一、 编写目的 2 二、 系统搭建 2 1. 下载相关软件包 2 2. Bootstrap编译 3 3. U-BOOT编译 5 4. LINUX编译 7 5. 通过U-BOOT的TFTP命令从TFTP服务器下载系统镜像 9 6. 文件系统制作 10 7. 挂载NFS作为根文件系统 10 三、 总结 14 一、编写目的 本文档用于记录AT91SAM9260 LINUX学

lshiceman的专栏 7412

strtok函数

微软提供的关于字符串处理的api真多,今天又发现一个,挺好玩的。 char string[] = "A string\tof ,,tokens\nand some  more tokens"; char seps[] = " ,\t\n"; char *tokens; cout tokens = strtok( string, seps); while(tokens != NULL)

meiyuli的专栏 928

DeepL Pro免费使用技巧与API调用优化方案

机器翻译技术通过神经网络模型实现跨语言语义转换,其核心价值在于保持专业术语准确性的同时实现自然语言流畅度。现代翻译工具如DeepL采用注意力机制等深度学习技术,在医疗、法律等专业领域展现出接近人工翻译的质量。针对API调用场景,开发者可通过请求模拟实现小批量自动化处理,而文档预处理和术语库优化则能显著提升免费额度使用效率。本文重点解析如何通过字符计算优化、临时接口调用等工程实践方法,在合规前提下最大化利用免费翻译资源。

weixin_29038303的博客 265

字符串分割strtok_s

char szBuffer[256]{0}; char *PNext=nullptr; char *str; str=strtok_s(szBuffer, "|", &PNext); while (nullptr!=str) { //cout cout str=strtok_s(NULL, "|", &PNext); }

u012023801的专栏 1059

【CMU-自主导航与规划】Autonomous Exploration Development Environment 实战:从环境搭建到多场景测试

本文详细介绍了CMU开源自主导航开发环境(Autonomous Exploration Development Environment)的实战部署与测试。内容涵盖从Ubuntu与ROS环境搭建、仿真场景配置,到核心导航模块(地形分析、局部避障、航点跟踪)的深度解析,并演示了如何集成TARE探索与FAR规划等上层算法,最终指导连接真实SLAM与实车部署,完成多场景性能评估。

weixin_29215391的博客 706

Excel药品说明书数据库:从零开始搭建医药数据查询系统(附完整模板)

本文详细介绍了如何从零开始搭建Excel药品说明书数据库,提供完整的医药数据查询系统模板。涵盖数据库架构设计、数据清洗标准化、智能查询系统搭建及维护优化,帮助医药从业者高效管理药品信息,提升查询速度和准确性。

weixin_28327051的博客 234

vc中分割字符串函数,自己写的函数

转:http://blog.sina.com.cn/s/blog_5f93da790100deah.html  程序中经常会遇到要处理用某些符号(如空格,或“, ; . | \t”等)分隔的字符串的问题,我今天就遇到了,在网上找了一些资料,做个总结。    处理方法 1. 用MFC CString之Find处理字符串 // 以下方法将一个字符串分解后放到一个CStr

strong0511的博客 2483

基于STM32的电子时钟设计

基于STM32的电子时钟设计1、设计目的2、设计具体要求3、proteus仿真图4、程序代码 1、设计目的 (1)掌握使用KEIL MDK5进行软件开发的具体流程; (2)掌握硬件电路的设计方法; (3)掌握STM32微控制器的程序设计及代码编写方法。 2、设计具体要求 (1)通过STM32自带的实时时钟功能获取时间信息; (2)在OLED显示屏上显示日期、时、分、秒等时间信息; (3)通过按键可对时间信息进行修改; (4)具有闹钟设定功能; (5)加分项:自行增加其他功能。 3、proteus仿真图 4

唯一的博客 2万+

VC 拆分字符串【转】

一._tcstok函数在MFC中,一个CString str=“ab ac dd PM”,怎么把他分开成ab和ac和dd和PM这四个字符串,类似string的split的功能? _tcstok声明头文件:char* _tcstok( char* strToken, const char* strDelimit );该函数是可以从一个CString串中,根据提供的分隔符,截取并返回一

xiaocai0807的专栏 1199

思博伦仪表打流测试使用总结

下图红框中的checkbox为选中状态时,表示该流会携带测试仪做一些分析,包括时延和乱序等信息时需要的一些字节,当改选项选中时,如配置IPv4的TCP流,最小字节长度必须为78字节;如果需要64字节的TCP流,改选项必须不选中;

陌上花开缓缓归以的博客 1465

ransac拟合2D圆(三点定圆 c++详细版)

RANSAC(Random Sample Consensus,随机采样一致性)算法是一种基于随机采样的迭代算法,主要用于从一组包含大量噪声和异常值(外点)的数据中估计数学模型的参数。

twnkie的博客 1047

strtok()函数详解!

strtok()函数详解! 1.定义 分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。在头文件#include&lt;string.h&gt;中。 2.原型 char *strtok(char s[], const char *delim); 3.说明 (1)当...

魏波 20万+

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

AI人人懂 2747

strtok函数用法

原型:char *strtok(char *s, char *delim); 功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。 说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。 strtok在s中查找包含在delim中的

极简Qt 4万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C语言菜鸟入门·字符串分割函数·strtok ()

符串分割函数strtok浅析,一文带你熟悉strtok的用法

时光の尘的博客 3392

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

strtok和strtok_s函数使用说明

strtok函数

qq_42287144的博客 3488

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux-strtok函数用法

原型:char *strtok(char *s, char *delim); 功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。 说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。 strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,直到找遍整个字符串。 返回指向下一个标记串。当没有标记串时则返回空字符NULL。

wendellluntan的博客 2702

Linux C strtok_r 用法及代码实例

【代码】Linux C strtok_r 用法及代码实例。

qq_33172851的博客 540

strtok 解析字符串

char strEventTime[] = "2010/08/11 10:38:22"; char *token = NULL; token = strtok(strEventTime, "/"); char *year = token; if (token != NULL) { token = strtok(NULL, "/"); } char *month = token; if (token != NULL) { ...

rodagss的博客 213

strtok函数()

函数返回第一个分隔符分隔的子串后,将第一参数设置为NULL,函数将返回剩下的子串 int main() { char test1[] = "feng,ke,wei"; char *test2 = "feng,ke,wei"; char *p; p = strtok(test1, ","); w...

diaobin0154的博客 249

彻底搞清楚strtok的使用

2、第二次调用strtok,传入的是NULL,因为不需要从头开始,而是从上面第一步的结束位置开始往下找下一个。最后是:"This is \0 www.runoob.com \0 website"开始是:"This is - www.runoob.com - website"该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。它会修改原字符串,把要找的字符改为null也就是字符'\0'“-”,就是从-后面的空格开始(空格的ascii码是32),返回前面字符串的指针,并把。

weixin_39257775的博客 509

浅谈strstr函数和strtok函数

记录C语言小白的学习历程 strstr函数 strtok函数

2402_86037826的博客 1151

c语言strtok函数实用细节

如上面1,2所示的分割过程,第二次strtok时,strtok函数中第一个参数变为了NULL,即函数将 "ni" 分割出来后,将原本空格的位置 (空格也是一个字符,ASCII码值为32) 替换成了 \0 , 所以是从NULL开始分割,NULL和 \0 都代表无值或结束。如1,2的演示,在str_tok函数中,使用了两次strtok, 第一次返回的指针token为 "ni" 的指针。第一个是分割函数返回的字符串,第二个是源字符串,可以发现,已经被修改了,打印碰见\0结束,所以输出 "ni"

weixin_50082444的博客 795

strtok()函数的使用

#include #include using namespace std; /* strtok()函数的使用demo */ int main(){ char str[] = "2012/11/08 00:02";//待分割的字符串 char * strTmp = strtok(str,"/:");//第一个分割,注意第一个参数 while(strTmp){ printf("%

以家为家,以乡为乡,以国为国,以天下为天下 1089

strtok使用和隐藏坑

strtok的隐藏坑

wangcg123的专栏 2167

strtok

原型:char *strtok(char *s, char *delim); 功能:分解字符串。s为要分解的字符串,delim为分隔符字符串。 说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。 strtok在s中查找包含在delim中的字符并用NULL(‘\0’)来替换,直到找遍整个字符串。 返回指向下一个标记串。当没有标记串时则返回空字符NULL。 /* 注意返回

fly__chen的博客 608
上一篇: _gcvt(),_ecvt(),_fcvt()参数意义及区别 08.12.01
下一篇: VC6.0 删除旧类,添加新类的方法 08.12.4
bufrfish
博客等级 码龄18年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值