C函数Strtok,,,,,strcpy详解-阿里云开发者社区

开发者社区> 玄学酱> 正文

C函数Strtok,,,,,strcpy详解

简介:
+关注继续查看

用途:在s中找出以ct中的字符为分隔的字符串,即是源串中除去了含有分隔串中的所有字符后余下的一段段的字符串,每调用一次找到一串,找不到则返回空串。第一次调用必须传给它有效的字符串,第二次传NULL就可以了,每次调用返回找到的子串的时候都会把源串中该子串的尾部字符(原来是搜索串中的某一字符)修改成'/0'字符返回值为每次调用得到的字串。

    下面看一下它的使用

    char sbody[]= "Presetptz/r/nPreset1=hello/r/nPreset2=ttttt/r/nend/r/n";

    ///char *pbody= "Presetptz/r/nPreset1=hello/r/nPreset2=ttttt/r/nend/r/n";//errror

    char except[] = "12/r/n";

    char *ptoken = NULL;

    ptoken = strtok(sbody,except);

    while(NULL!=ptoken)

    {

    printf("%s/n",ptoken);

    ptoken = strtok(NULL,except);

    }

    输出为:

    Presetptz

    Preset

    =hello

    Preset

    =ttttt

    end

下面我们看一下它的源码:

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

    }

    其中:  ssize_t strspn(const char* s,char*accept)// 返回accept中任一字符在s中第一次出现的位置

    char * strpbrk(const char * cs,const char * ct)//返回指向ct中任一字符在cs中第一次出现的位置

    这个函数不难分析,___strtok指针指向除去第一个有效字串后面的位置,到这里我们应该清楚为什么第二次调用时只要传NULL就可以了,当然这里也暴露了它的缺点,就是说不能有两个线程同时使用strtok否则就会出现错误。还有就是我在使用这个函数时碰到的问题,如上面的代码如果我把sbody换成 pbody,则编译没有问题,运行时就会出错,为什么?还是自己的基本功不扎实,pbody在是个静态字符串,说白了,它是在编译时就已经赋值而且相当于是一个const常量,不能被修改,而strtok是需要修改字符串的,所以产生问题不足为奇。



 原型声明:extern char *strcpy(char *dest,const char *src);

  头文件:string.h
  功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间
  说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
  返回指向dest的指针

 








====================================分割线================================



最新内容请见作者的GitHub页:http://qaseven.github.io/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁。 [cpp] view plain copy    print? void test_asio_nowork()   {       b...
1195 0
函数计算的操作控制台详解
今天这篇文章主要给大家介绍一款阿里云新推出的产品——函数计算的控制台的操作方法。 首先,打开阿里云的官网,点击产品页,在弹性计算里面点击函数计算,进入管理控制台。 首先,我们来熟悉几个概念,阿里云的函数计算有四个核心概念:服务、函数、事件和触发器。
1090 0
C++中类成员函数指针详解
原文出处:点击打开链接       在C++中类成员函数指针是一种比较特别的指针,尽管直接使用类成员函数的情况不太多,但是还是有必要详解一下这类指针。       具体语法       首先说明一下类成员函数指针的声明方式:        Return_Type (Class_Name::* pointer_name) (Argument_List); Return_
1167 0
2014秋C++ 第12周项目 C++函数新特征与递归函数
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目1- 阅读程序】阅读下列程序,写出程序的运行结果。上机时运行程序,与你的预期进行对照、理解。如果对运行结果和其背后的原理仍不理解,请通过单步执行的手段跟踪理解。(1)阅读下面两个有静态局部变量
1133 0
C++函数对象
  原文:http://blog.csdn.net/ggggqqqqihc/article/details/1727020   标准库里的count_if可以统计容器中满足特定条件的元素的个数。例如要统计一个整数vector——ivec中正数的个数,可以先写一个返回类型为bool,含有一个int参数的条件函数: bool pred(int val){ return val>0; }    之后可以用count_if(ivec.begin(),ivec.end(),pred)计算出正整数的个数。
485 0
+关注
玄学酱
这个时候,玄酱是不是应该说点什么...
20710
文章
438
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载