strok函数的使用
转自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函数的使用相关推荐
- strok函数用法【转】
本文转载自:http://blog.csdn.net/hexiechina2010/article/details/25096763 char *strtok( char *strToken, con ...
- C语言进阶 之 字符串函数(4)
C语言中对字符和字符串的处理是很频繁,但是C 语言本身是没有字符串类型的,字符串通常放在 常量字符串 中 或者 字符数组中.字符串常量 适用于那些对它不做修改的字符串函数. 函数介绍 strlen s ...
- 深入理解计算机系统——第12章 并发编程
深入理解计算机系统--第12章 并发编程 并发编程 如果逻辑控制流在时间上重叠,那么就称它们是并发的.注意:核心是在时间上重叠. 操作系统内核运行多个应用程序采用了并发机制,但并发不止用于内核,也用于 ...
- C++字符串操作函数strstr,strcmp,strlen,strcpy,strcat,strok
C++中字符串操作函数非常常见,下面是一些常用的str相关操作函数: strstr strstr: 在字符串中查找子字符串 C++ const char* strstr(const char* str ...
- C语言字符串处理的一些函数strok,strstr, strchr,strsub
字符串切割函数 函数原型:char *strtok(char *s, char *delim); 函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果. 函数使用说: 1.strtok ...
- 认识函数strok()--eg.分解保存读到的IP配置
strtok()函数详解! 1..定义 分解字符串为一组字符串.s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符).首次调用时,s指向要分解的字符串,之后再 ...
- C语言—字符串函数和内存函数
文章目录 1.前言 2.字符串函数 2.1 长度不受限制的字符串函数 2.1.1 strlen 内部细节 使用方法 模拟实现 2.1.2 strcmp 内部细节 使用方法 模拟实现 2.1.3 str ...
- 引入:字符串切割strtok()函数
问题引入 最近在解决AHNU在线测试http://172.16.94.19:8080/JudgeOnline/showproblem?problem_id=1496时,遇到了麻烦,问题描述如下: De ...
- 计算机函数成绩排名,EXCEL工具程序:成绩排名
EXCEL工具程序:成绩排名 一.功能简介: 本小程序采用VB编写,可以对EXCEL数据表进行排名,主要有以下几种功能: 1.单列排名:按某一列进行排名,如成绩总分,或某一单科成绩: 2.多列排名:可 ...
最新文章
- (转)教你实现Winform窗体的四边阴影效果
- python解析json_python解析json文件
- 802.15.4的超帧
- java 求最长子串
- C++之STL种类及实现
- Xamarin Android中引用Jar包的方法
- SQL Server数据库简繁体数据混用的问题
- pycharm专业版下载安装与使用
- 云课堂数据分析师项目实战(完整)
- inflate的使用
- (数位dp) 算法竞赛入门到进阶 书本题集
- c语言程序如何首行缩进,什么叫代码缩进
- 文档型非关系数据库MongoDB经验总结
- 274. H 指数(中)
- 什么是文件包含漏洞?文件包含漏洞分类!
- python正则表达式与文本匹配
- 共享计算机型n4中n代表什么,n代表什么(n代表的所有含义)
- hyper-v使用记录
- html怎么给段落加边框,Word2010怎样为段落加上边框
- 360正式造车,网友:自带杀毒软件吗?
热门文章
- “好歌曲”进“主打之争” 刘欢原创大碟打头阵
- iq卡root在这边怎么搞,iqoo的root
- GRAINS: Generative Recursive Autoencoders for INdoor Scenes 2019 TOG(家居布局、树结构网络、RvNN)
- qt检测网络状态 Linux,Qt检测设备是否在线(Ping)
- 糖尿病不控制,老王后悔莫及
- 编写可维护软件的不朽代码随想-2
- linux中的$是什么意思
- 2013年9月——《被污染的标准》
- 打字软件带倒计时_使用VueJS创建打字速度效果-第2部分:计时器和计分板
- 异常检测:Towards Total Recall in Industrial Anomaly Detection