strtok()函数并不像你想的那样可以一次切割字串。需要多次循环,第二次时需要用 p = strtok(NULL, " "); 这样的 形式。
我们提供的服务有:网站建设、网站制作、微信公众号开发、网站优化、网站认证、介休ssl等。为上1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的介休网站制作公司
void main()
{ char test1[] = "Hello C World";
char *p;
p = strtok(test1, " ");
while(p)
{
printf("%s\n", p);
p = strtok(NULL, " ");
}
return 0;
}
运行结果:
Hello
C
World
直接的问题出在这句:
strcpy(str,s2);
strtok返回的指针,指向是str中相对位置;你s2之后,把s2再拷贝会str,这时的str变成了(A,C),而前面的s1指向的是str的相对位置,因此s1的指向,也从原来的(A,B)变成了(A,C),因此后面的结果也变了。
你起码应该引入新变量,char str2[]; 然后
strcpy(str2,s2);
又:strtok会破坏原来的字符串;strcpy不要用在“源”和“目的”重叠的地方(你例子中str和s2就重叠了);后面的strcpy(v1,S5),应该注意检测s5是否为NULL,否则容易出问题;同理strcpy(v2, s6)亦然。
char *___strtok;//关键这个全局指针变量
char * strtok(char * s,const char * ct)
{
char *sbegin, *send;
sbegin = s ? s : ___strtok;//不等于NULL用原始字符串,否则用___strtok
if (!sbegin) {
return NULL;//结尾
}
sbegin += strspn(sbegin,ct);//
if (*sbegin == '/0') {
___strtok = NULL;
return( NULL );
}
send = strpbrk( sbegin, ct);
if (send *send != '/0')
*send++ = '/0';
___strtok = send;
return (sbegin);
}
这个是strtok函数原型.你可以参考一下
#include string.h char *strtok( char *str1, const char *str2 ); 功能:函数返回字符串str1中紧接“标记”的部分的指针, 字符串str2是作为标记的分隔符。如果分隔标记没有找到,函数返回NULL。为了将字符串转换成标记,第一次调用str1 指向作为标记的分隔符。之后所以的调用str1 都应为NULL。
例如:
char str[] = "now # is the time for all # good men to come to the # aid of their country"; char delims[] = "#"; char *result = NULL; result = strtok( str, delims ); while( result != NULL ) { printf( "result is \"%s\"\n", result ); result = strtok( NULL, delims ); } 以上代码的运行结果是:
result is "now " result is " is the time for all " result is " good men to come to the " result is " aid of their country" 相关主题:
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之后还要在程序中使用这个字符串,则应复制这个字 符串。
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款