c++里面,函数strtok怎么用?

尤其是参数怎么处理?

  strtok:
  分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。
  功能:
  分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
  例如:strtok("abc,def,ghi",","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。
  函数使用:

  strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。
  c
  #include<string.h>
  #include<stdio.h>
  int main(void)
  {
  char input[16]="abc,d";
  char*p;
  /*strtok places a NULL terminator
  infront of the token,if found*/
  p=strtok(input,",");
  if(p)
  printf("%s\n",p);
  /*Asecond call to strtok using a NULL
  as the first parameter returns a pointer
  to the character following the token*/
  p=strtok(NULL,",");
  if(p)
  printf("%s\n",p);
  return0;
  }
  

  c++
  
  #include<iostream>
  #include<cstring>
  using namespace std;
  int main()
  {
  char sentence[]="This is a sentence with 7 tokens";
  cout << "The string to be tokenized is:\n" << sentence << "\n\nThe tokens are:\n\n";
  char *tokenPtr=strtok(sentence,"");
  while(tokenPtr!=NULL) {
  cout<<tokenPtr<<'\n';
  tokenPtr=strtok(NULL,"");
  }
  //cout << "After strtok,sentence=" << tokenPtr<<endl;return0;
  }
  

  函数第一次调用需设置两个参数。第一次分割的结果,返回串中第一个 ',' 之前的字符串,也就是上面的程序第一次输出abc。
  第二次调用该函数strtok(NULL,","),第一个参数设置为NULL。结果返回分割依据后面的字串,即第二次输出d。
  strtok是一个线程不安全的函数,因为它使用了静态分配的空间来存储被分割的字符串位置
  线程安全的函数叫strtok_r,ca
  运用strtok来判断ip或者mac的时候务必要先用其他的方法判断'.'或':'的个数,因为用strtok截断的话,比如:"192..168.0...8..."这个字符串,strtok只会截取四次,中间的...无论多少都会被当作一个key
  其他相关信息
  下面的说明摘自于最新的Linux内核2.6.29,说明了这个函数已经不再使用,由速度更快的strsep()代替
  /** linux/lib/string.c** Copyright (C) 1991, 1992 Linus Torvalds*//** stupid library routines.. The optimized versions should generally be found
  * as inline code in <asm-xx/string.h> 
  * These are buggy as well.. 
  * * Fri Jun 25 1999, Ingo Oeser <ioe@informatik.tu-chemnitz.de> 
  * - Added strsep() which will replace strtok() soon (because strsep() is 
  * reentrant and should be faster). Use only strsep() in new code, please. 
  ** * Sat Feb 09 2002, Jason Thomas <jason@topic.com.au>, 
  * Matthew Hawkins <matt@mh.dropbear.id.au> 
  * - Kissed strtok() goodbye
  */
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-05-26
函数strtok将字符串分解为一系列标记(token)标记就是一系列用分隔符(delimiting chracter,通常是空格或标点符号)分开的字符。例如,在一行文本中,每个单词可以作为标记,空格是分隔符。
需要多次调用strtok才能将字符串分解为标记(假设字符串中包含多个标记)。第一次调用strtok包含两个参数,即要标记化的字符串和包含用来分隔标记的字符的字符串(即分隔符):在图5.33的例子中,下列语句:
tokenPtr = Strtok(string, " ");
将tokenPtr赋给string中第一个标记的指针。strtok的第二个参数””表示string中的标记用空格分开。
函数strtok搜索string中不是分隔符(空格)的第一个字符,这是第一个标记的开头。然后函数寻找字符串中的下一个分隔符,将其换成null(, w,)字符,这是当前标记的终点。函数strtok保存string中标记后面的下一个字符的指针,并返回当前标记的指针。
/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}

Output:

Splitting string "- This, a sample string." into tokens:
This
a
sample
string
后面再调用strtok时,第一个参数为NULL,继续将string标记化。NULL参数表示调用strtok继续从string中上次调用 strtok时保存的位置开始标记化。如果调用strtok时已经没有标记,则strtok返回NULL。图5.33的程序用strtok将字符串” This is sentence with 7 tokens”标记化。分别打印每个标记。注意strtok修改输入字符串,因此,如果调用strtok之后还要在程序中使用这个字符串,则应复制这个字 符串。
第2个回答  推荐于2017-09-16
char *strtok(char *s, char *delim);
分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。
strtok在s中查找包含在delim中的字符并用NULL('')来替换,直到找遍整个字符串。本回答被提问者采纳
第3个回答  2010-04-10
char * strtok ( char * str, const char * delimiters );

Parameters
str
C string to truncate. The contents of this string are modified and broken into smaller strings (tokens).
Alternativelly, a null pointer may be specified, in which case the function continues scanning where a previous successful call to the function ended.
delimiters
C string containing the delimiters.
These may vary from one call to another.
Return Value
A pointer to the last token found in string.
A null pointer is returned if there are no tokens left to retrieve.

Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}

Output:

Splitting string "- This, a sample string." into tokens:
This
a
sample
string

参考资料:http://www.cplusplus.com/reference/clibrary/cstring/strtok/

C++ strtok()
例如,分割字符串 "Hello, World! This is a test." 时,可以按空格、逗号和句点操作。strtok 函数会将原始字符串修改为 null 终止,如果不希望修改原始字符串,可以使用 C11 的 strtok_s 或 C++ 的 std::strtok 和 std::string 作为替代。为了存储分割后的子字符串,可以使用字符指针数组。如下...

C++ strtok应用方式浅析
C++ strtok原形如下:char *strtok(char *strToken,const char *strDelimit );\/\/ crt_strtok.c\/**\/\/* In this program, a loop uses strtok* to print all the tokens (separated by commas* or blanks) in the string named "string". *\/#includestring.h#includestdio.hchar string[] = ...

C\\C++ strtok()函数的使用及字符串处理
strtok = find token in string.它被设计用于词法分析的前期,token分离的阶段。你的需求需要一点简单的语法结构的嵌入,所以不适合使用这个函数。你有几个选择:1、编写你自己的语法(DSL)解释器。2、使用某个支持正则表达式匹配的函数库。3、仅处理这种特别的字符串,就这么机械地匹配吧。从表述上看,...

c++ strtok()问题
strtok在s中查找包含在delim中的字符并用NULL('\\0')来替换,直到找遍整个字符串。返回指向下一个标记串。当没有标记串时则返回空字符NULL。举例:\/\/ strtok.c include <syslib.h> include <string.h> include <stdio.h> main(){ char *s="Golden Global View";char *d=" ";char *p;clrsc...

C++ strtok函数
函数strtok()实际上修改了有str1指向的字符串。每次找到一个分隔符后,一个空(NULL)就被放到分隔符处,函数用这种方法来连续查找该字符串。例子:include <string.h> include <stdio.h> int main(){ char *p;char str[100]="This is a test ,and you can use it";p = strtok(str," "...

怎样用C\\C++函数分割字符串
其实,用C\\C++函数分割字符串的方法有很多种,下面给你分享其中一种方法:用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被...

因为一个函数strtok踩坑,我被老工程师无情嘲笑了(一)
在C\/C++字符串处理中,strtok函数是个常用工具,它能根据给定字符集分割字符串并返回子字符串。然而,strtok、strtok_s和strtok_r这三种变体函数值得我们关注。我曾因对strtok的误用,遭受了老工程师的无情嘲笑。strtok函数详解如下:它分解字符串成片段,返回每个子串。原型包括参数和返回值,首次调用返回...

c++中怎么分割字符串之strtok 函数
函数说明:strtok()用来将字符串分割成一个个片段。参数s 指向欲分割的字符串,参数delim 则为分割字符串,当strtok()在参数s 的字符串中发现到参数delim 的分割字符时则会将该字符改为\\0 字符。在第一次调用时,strtok()必需给予参数s 字符串,往后的调用则将参数s 设置成NULL。每次调用成功则返回...

[C++]当分割符为多个空格时,如何使用strtok函数将字符串分割?
strtok(code, " ,;");即空白是分隔符,逗号是分隔符,分号也是分隔符,不是说“空白逗号分号”3个符号组合为一个分隔符。所以strtok 函数,你写了3个空白,实际上定义的分隔符是1个空白。分割符为多个空格时你可以自己写函数,用循环语句一个字符一个字符地检查,连续遇到3个空白,把第3个空白换...

C++如何用strtok多次分割,对分割得到的字符串再分割?
{ char code[] = "th is$i s$a n$prob lem";char *p1 = code;char *p2;while((p2 = strtok(p1, " $")) != (char *)NULL){ printf("%s\\n", p2);p1 = (char *)NULL;} } 对问题补充的回答:如果需要“该字符串先用"$"作为分隔符分割,再对分割出的字符串用" "(空格)...

相似回答