Ⅰ c++里面,函数strtok怎么用
函数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之后还要在程序中使用这个字符串,则应复制这个字 符串。
Ⅱ C语言strtok函数使用问题。
#include<stdio.h>
#include<string.h>
#include<malloc.h>//动态内存分配函数malloc和free的头文件
int main()
{
int i,s;
char *a,*p,*str[100];
a=(char*)malloc(sizeof(char)*100);//开辟一个最大字节长度为100的空间
scanf("%[^\n]",a);//将开辟的空间拿来做字符串,使用scanf无法输入空格后面的[^\n]过滤了换行符之后的字符,这样就没事了
getchar();//还需要吸收垃圾字符,这个不能没有否则会出现死循环
p=strtok(a," ");//第一次以空格符分割
for(s=0;p;s++)//当p为空时跳出
{
str[s]=p;//将分割的传给指针数组str,str相当于字符串数组
p=strtok(NULL," ");//接着在分割
}
printf("%s",str[0]);
for(i=1;i<s;i++)
printf(" %s",str[i]);
printf("\n");
free(a);//释放内存
return 0;
}
VC++6.0测试通过
Ⅲ C语言strtok_r使用循环的时候,第二次循环只能取到NULL
需要看下你的二位数组xy_check的定义,才知道是不是定义有问题。
Ⅳ c语言,关于strtok
strtok会修改字符串,将分隔符处的字符换成\0。
你这里对常量字符串调用strtok,所以出错了。
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
Ⅳ C语言strtok函数能过滤换行符或者回车符吗
strtok(str , " "); 这样写应该可以
charstr[128];
char*p;
strcpy(str,"123 456 789 012 ");
p=strtok(str," ");
while(p)
{
printf("p=[%s]",p);
p=strtok(NULL," ");
}
Ⅵ char *strtok_r(char *s, const char *delim, char **ptrptr);中char **ptrptr是干嘛的
大部分*_r这种形式的函数基本都是可重入的函数,也可以认为是线程安全的函数,像这个函数strtok是用delim来切割s字符串,每次返回最新的切割结果,对于这个函数来说,每次执行都必须知道上一次的执行结果,因此每次执行都需要保存本次执行的状态,对于没有_r的函数,函数中使用static变量,但是在多线程时,很可能会出错,因此这个ptrptr所指向的地址保存的就是当前线程的调用结果,这样不同线程调用这个函数的时候就不会出错了, 具体是什么内容用户不必知道,只需要传入一个有效的地址就行了。
Ⅶ strtok_r的strtok的函数原型
为char *strtok_r(char *str, const char *delim, char **saveptr);
strtok_r函数是strtok函数的可重入版本。str为要分解的字符串,delim为分隔符字符串。char **saveptr参数是一个指向char *的指针变量,用来在strtok_r内部保存切分时的上下文,以应对连续调用分解相同源字符串。
第一次调用strtok_r时,str参数必须指向待提取的字符串,saveptr参数的值可以忽略。连续调用时,str赋值为NULL,saveptr为上次调用后返回的值,不要修改。一系列不同的字符串可能会同时连续调用strtok_r进行提取,要为不同的调用传递不同的saveptr参数。
strtok_r实际上就是将strtok内部隐式保存的this指针,以参数的形式与函数外部进行交互。由调用者进行传递、保存甚至是修改。需要调用者在连续切分相同源字符串时,除了将str参数赋值为NULL,还要传递上次切分时保存下的saveptr。

Ⅷ strtok_r函数
free 和 malloc 是对应的。如果从标准库或者系统库中得到的指针,一定是由库来维护的。从strtok_r输出的缓冲是在内部分配的,在程序结束的时候,库会进行释放操作的。如果你最后free了,就会造成double free的错误。
----------------------------------------
myStrBuf是从strtok_r输出的缓冲,系统对把分配到的一个缓冲的地址传给myStrBuf。但是具体是malloc还是其他带字节对齐的分配方法,这个由系统决定的。你只要记住一点,在你自己的程序里面有几个malloc就有几个free,不能多也不能少。其他的指针系统会管理的
------------------------------------------
程序最后是需要free的。free(str)但不是myStrBuf
Ⅸ POSIX定义了一个线程安全的函数——strtok_r,以此来代替strtok
POSIX是指POSIX标准,是描述Unix兼容的操作系统、平台等的一系列标准,可以参考这里:http://ke..com/view/209573.htm。
C POSIX函数库是POSIX系统上的一个语言无关(但使用了C函数调用约定)的函数库。*nix等POSIX系统所用的C标准库实现(例如glibc)同时实现了POSIX函数库。
Ⅹ C语言中strtok用法
strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。
strtok是一个线程不安全的函数,因为它使用了静态分配的空间来存储被分割的字符串位置
线程安全的函数叫strtok_r,ca。
运用strtok来判断ip或者mac的时候务必要先用其他的方法判断'.'或':'的个数,因为用strtok截断的话,比如:"192..168.0...8..."这个字符串,strtok只会截取四次,中间的...无论多少都会被当作一个key。
函数strtok保存string中标记后面的下一个字符的指针,并返回当前标记的指针。
后面再调用strtok时,第一个参数为NULL,继续将string标记化。NULL参数表示调用strtok继续从string中上次调用 strtok时保存的位置开始标记化。
如果调用strtok时已经没有标记,则strtok返回NULL。注意strtok修改输入字符串,因此,如果调用strtok之后还要在程序中使用这个字符串,则应复制这个字 符串。