转自https://blog.csdn.net/comeonwpk/article/details/54142280  (找不到原创博文)

在编程过程中,有时需要对字符串进行分割.而有效使用这些字符串分隔函数将会给我们带来很多的便利.

下面我将在MSDN中学到的strtok函数做如下翻译.

strtok :在一个字符串查找下一个符号

char *strtok( char *strToken, const char *strDelimit );

返回值:返回指向在strToken字符串找到的下一个符号的指针,当在字符串找不到符号时,将返回NULL.每

次调用都通过用NULL字符替代在strToken字符串遇到的分隔符来修改strToken字符串.

参数:
strToken:包含符号的字符串

strDelimit:分隔符集合

注:第一次调用strtok函数时,这个函数将忽略间距分隔符并返回指向在strToken字符串找到的第一个符

号的指针,该符号后以NULL字符结尾.通过调用一系列的strtok函数,更多的符号将从strToken字符串中分

离出来.每次调用strtok函数时,都将通过在找到的符号后插入一个NULL字符来修改strToken字符串.为了

读取strToken中的下一个符号,调用strtok函数时strToken参数为NULL,这会引发strtok函数在已修改过

的strToken字符串查找下一个符号.

Example(摘自MSDN)

/* STRTOK.C: In this program, a loop uses strtok
 * to print all the tokens (separated by commas
 * or blanks) in the string named "string".
 */

#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 );
   }
}

Output

A string   of ,,tokens
and some  more tokens

Tokens:
 A
 string
 of
 tokens
 and
 some
 more

tokens

以下转自https://blog.csdn.net/js_xj/article/details/5863734

函数原型:char *strtok(char *s, char *delim);

函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果。

函数使用说:

1.strtok函数的实质上的处理是,strtok在s中查找包含在delim中的字符并用NULL(’/0′)来替换,直到找遍整个字符串。这句话有两层含义:(1)每次调用strtok函数只能获得一个分割单位。(2)要获得所有的分割单元必须反复调用strtok函数。

2.strtok函数以后的调用时的需用NULL来替换s.

3.形参s(要分割的字符串)对应的变量应用char s[]=”….”形式,而不能用char *s=”….”形式。

例子如下:

#include <stdio.h>

#include <string.h>

int main(void)

{

char buf[]=”Golden Global View”;

char* token = strtok( buf, " ");

while( token != NULL )

{

printf( ”%s “, token );

token = strtok( NULL, ” “);

}

return 0;

}

其结果为:

Golden

Global

View

但是如果我们把char buf[]=”Golden Global View”;换成char *buf=”Golden Global View”; 则会出错,原因是如果分配的大小一样的前提下char *p和char b[]也是有区别的,
char *p="abc";
char b[]="abc";
当这两个语句编译后,编译器会将“abc”放在常量区中,而strtok(char *s, char *delim)函数是在s中查找包含在delim中的字符并用NULL(’/0′)来替换,直到找遍整个字符串。这句话就能体现指针和数组的区别:既然查找就要p++/b++。 要替换成(‘/0’),那么就要对*p/*b赋值
*p='/0';
*b='/0';
p指针是指向常量字符串的,对*p操作就是对字符串操作,这显然会编译不通过的。
b是字符数组的首地址,这个数组里面的元素是‘a’、'b'、'c'、'/0',和字符串“abc”看上去是一样,不过并不是同一个。相当于,b数组里可以存放其他东西'1'、'2'、'3'、'/0',只不过在编译到char b[]="abc";后给这个b数组里的元素值改变了,所以对*b的操作并不影响字符串。

如果我们把token = strtok( NULL, ” “);换成token = strtok( buf, " ");则while循环会成为一个无限循环,而输出的结果就只为:Golden。我的解释原因如下: 在strtok函数体中有一个char 类型的指针(假设为 char *p),它的作用就是令p=s,用于保存s的起始地址。由于在随后的处理中指针p的值会一直保存(C语言中指针的特点),因此在以后的strtok调用中用NULL来代替s的原因就是防止p被重新赋值而指向s的起始地址,从而可以保证p可以指向s的其他位置,直到最后分割完整个字符串。 但是如果用s来代替NULL,那么每次调用strtok时,p就会指向s的初始地址,从而只能获得第一个分割出来的字串,如上面的例子中while会是一个无限循环,而输出的结果只能是“Golden”。

strok函数的使用相关推荐

  1. strok函数用法【转】

    本文转载自:http://blog.csdn.net/hexiechina2010/article/details/25096763 char *strtok( char *strToken, con ...

  2. C语言进阶 之 字符串函数(4)

    C语言中对字符和字符串的处理是很频繁,但是C 语言本身是没有字符串类型的,字符串通常放在 常量字符串 中 或者 字符数组中.字符串常量 适用于那些对它不做修改的字符串函数. 函数介绍 strlen s ...

  3. 深入理解计算机系统——第12章 并发编程

    深入理解计算机系统--第12章 并发编程 并发编程 如果逻辑控制流在时间上重叠,那么就称它们是并发的.注意:核心是在时间上重叠. 操作系统内核运行多个应用程序采用了并发机制,但并发不止用于内核,也用于 ...

  4. C++字符串操作函数strstr,strcmp,strlen,strcpy,strcat,strok

    C++中字符串操作函数非常常见,下面是一些常用的str相关操作函数: strstr strstr: 在字符串中查找子字符串 C++ const char* strstr(const char* str ...

  5. C语言字符串处理的一些函数strok,strstr, strchr,strsub

    字符串切割函数 函数原型:char *strtok(char *s, char *delim); 函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果. 函数使用说: 1.strtok ...

  6. 认识函数strok()--eg.分解保存读到的IP配置

    strtok()函数详解! 1..定义 分解字符串为一组字符串.s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符).首次调用时,s指向要分解的字符串,之后再 ...

  7. C语言—字符串函数和内存函数

    文章目录 1.前言 2.字符串函数 2.1 长度不受限制的字符串函数 2.1.1 strlen 内部细节 使用方法 模拟实现 2.1.2 strcmp 内部细节 使用方法 模拟实现 2.1.3 str ...

  8. 引入:字符串切割strtok()函数

    问题引入 最近在解决AHNU在线测试http://172.16.94.19:8080/JudgeOnline/showproblem?problem_id=1496时,遇到了麻烦,问题描述如下: De ...

  9. 计算机函数成绩排名,EXCEL工具程序:成绩排名

    EXCEL工具程序:成绩排名 一.功能简介: 本小程序采用VB编写,可以对EXCEL数据表进行排名,主要有以下几种功能: 1.单列排名:按某一列进行排名,如成绩总分,或某一单科成绩: 2.多列排名:可 ...

最新文章

  1. (转)教你实现Winform窗体的四边阴影效果
  2. python解析json_python解析json文件
  3. 802.15.4的超帧
  4. java 求最长子串
  5. C++之STL种类及实现
  6. Xamarin Android中引用Jar包的方法
  7. SQL Server数据库简繁体数据混用的问题
  8. pycharm专业版下载安装与使用
  9. 云课堂数据分析师项目实战(完整)
  10. inflate的使用
  11. (数位dp) 算法竞赛入门到进阶 书本题集
  12. c语言程序如何首行缩进,什么叫代码缩进
  13. 文档型非关系数据库MongoDB经验总结
  14. 274. H 指数(中)
  15. 什么是文件包含漏洞?文件包含漏洞分类!
  16. python正则表达式与文本匹配
  17. 共享计算机型n4中n代表什么,n代表什么(n代表的所有含义)
  18. hyper-v使用记录
  19. html怎么给段落加边框,Word2010怎样为段落加上边框
  20. 360正式造车,网友:自带杀毒软件吗?

热门文章

  1. “好歌曲”进“主打之争” 刘欢原创大碟打头阵
  2. iq卡root在这边怎么搞,iqoo的root
  3. GRAINS: Generative Recursive Autoencoders for INdoor Scenes 2019 TOG(家居布局、树结构网络、RvNN)
  4. qt检测网络状态 Linux,Qt检测设备是否在线(Ping)
  5. 糖尿病不控制,老王后悔莫及
  6. 编写可维护软件的不朽代码随想-2
  7. linux中的$是什么意思
  8. 2013年9月——《被污染的标准》
  9. 打字软件带倒计时_使用VueJS创建打字速度效果-第2部分:计时器和计分板
  10. 异常检测:Towards Total Recall in Industrial Anomaly Detection