写strcmp函数,Python中seek函数

  写strcmp函数,Python中seek函数

  strtok函数的用法:1。它作用于字符串S,以delim中的字符为分隔符,将S分隔成一个子串;2.当s为空时,保存在函数中的指针[SAVE_PTR]通过下面的调用定位在起始位置。

  免费推荐:编程视频课程

  使用strtok函数:

  一.职能概述

  原型:char*strtok(char*s,char *delim))))))))。

  函数:作用于字符串S,以delim中的字符为分隔符,将S分隔成一个子串;如果s为空,保存在函数中的指针SAVE_PTR将在下一次调用中开始。

  返回值:分隔符匹配的第一个子字符串。

  二、主要内容

  1.函数分解字符串。分解返回strtok中的第一个子串(第一次,因为它没有生成新的字符串,只是在s指示的内容中第一次出现的位置将分隔符修改为“/0”。

  2.在第一次子串提取之后,继续提取源串S,然后(第二次和第三次。第n次)调用为strtok的第一个参数指定NULL。这意味着函数从最后一次调用被隐式保存的位置继续,字符串分解继续。在最后一次调用中,在第一次调用结束之前,用这个指针指向分隔符的下一位。)

  3.如果这个指针指向“\0”,即没有分段的子串,则返回NULL。

  4.delim可以看作是一组分隔符,delim中的所有字符都可以作为分隔符。

  5.调用strtok时,如果起始位置是分隔符,则起始位置的分隔符将被忽略。

  三。使用strtok时的注意事项如下。

  1.函数用于分解字符串。分解意味着不生成新的字符串,但是处理s表示的内容。所以源字符串s变了!

  将源字符串s转换为charbuffer[info_max_SZ]=,Fred male 25,John male 62,Anna female 16 ;筛选器delim是char *delim= ,空格是分隔符。

  在上面的代码中,结果如下。

  首先,缓冲区发生了变化。此时,如果打印出buffer的值,会显示“,Fred”,但后面的“男25…16”会飞走。strtok函数实际上是根据delim中的分隔符找到Fred之后的空格,也就是第一个出现的位置,修改为“/0”。其余位置保持不变。这就解释了为什么在打印缓冲区的值时只显示“、Fred”而不是缓冲区的所有内容。因此,在使用strtok时,注意不要更改源字符串。

  知道了buffer的变化,就可以很好的解释函数的返回值了。返回值buf是分隔符的前一个子列。(其实这个表述不准确。详情请参考)3)返回值详情。从变量的地址可以看出,buf仍然指向源字符串。

  如果分隔符delim不变,停止截图。

  2.在第一次子串提取之后,要继续提取源字符串S,请遵循(第二次和第三次)。第n次)调用为strtok的第一个参数指定NULL。

  第一次调用的结果如上,提取了、Fred 。我们想继续以空间为边界,提取下面的‘男’等。从上图可以看出,第一次调用后,我们都把第一个参数NULL给了strtok。(指示函数从上次调用被隐式保存的位置继续,并且字符串分解继续。在上面提到的第二次调用中,在第一次调用结束之前,分隔符的下一位(即‘m’的位置)用this指针指定,可以按此顺序提取。诸如此类。

  至于为什么赋空值,请记住结论,或者调查strtok的源代码。文末有几个介绍。

  当然也有人喜欢看不按套路出牌会怎么样,但是不给空值继续代入buffer。其实我想了想就知道答案了。再次传递缓冲区相当于从字符串的开头开始寻找分隔符delim,而此时缓冲区只是被纠正(可见部分是)和Fred()),所以结果一定是找到了分隔符delim。

  3.关于函数返回值的讨论

  如上所述,如果提取了一个子串,strtok返回值(假设赋给了指针buf)就是提取的子串的指针。这个指针指向源字符串中子串的起始位置。字符串末尾的以下字符是提取前的分隔符,提取后修改为“/0”。因此,如果打印buf的值,就可以很好地输出部分序列的内容。

  如果没有提取子列,函数将返回什么值?

  从上图可以看出,buffer不包含分隔符delim。strtok被调用后buf的值为

  因为没有找到,所以源字符串缓冲区保持不变,buf指向源字符串的起始地址,打印输出值完整。

  字符串的完整值。

  什么时候函数的返回值是NULL?

  百度说“没有分段字符串时,会返回NULL。”这是一个非常含糊的说法。如果想清楚这个问题,可能需要看看strtok的实现原理。这里有一个实验性的解释。

  strtok第一次调用,毫无疑问buf指向的是、Fred”。

  第二次调用strtok时,由于第一个参数为NULL,意味着函数在上次调用保存的这个指针的位置继续分解,也就是‘男25’。分解后,buf指向‘男性’。

  当第三次调用strtok时,该参数将继续设置为NULL。此时,第二次保存的这个指针的位置将被分解,即‘25’将被分解。Buf指向 25 ,因为找不到包含分隔符delim的子字符串。

  在第四次调用中,参数仍然为空。此时,第三次调用中保存的this指针已经指向字符串/0 的末尾,不能再分解了。所以函数返回NULL,也就是百度百科提到的“没有分段字符串时,函数返回NULL。”

  4.关于参数分隔符delim的讨论(delim是一组分隔符)

  很多人在使用strtok时,理所当然地认为函数在拆分字符串时完全匹配分隔符delim,比如Delim="ab "。对于字符串“acdab”,该函数提取“acd”。至少我第一次用的时候是这么想的。其实我们都错了。我是在看函数源代码的时候发现这个问题的。让我们看看下面的例子。

  源字符串是buffer,分隔符delim是逗号和空格。按照大致思路,我们会认为调用函数后,buf的值是‘弗雷德,男,25’。这是结果吗?

  第一次通话后的结果竟然是‘弗雷德’,不是我们想的那样。这是为什么呢?

  让我们回到GNU C库中strtok的函数定义:“解析成delim中用字符分隔的令牌”。也就是说,delim中包含的字符可以作为分隔符,而不是严格匹配。Delim可以理解为一组分隔符。这个很重要~

  当然,当我们分解字符串时,我们很少使用多重分隔符。结果很多人在写例子的时候只讨论一个分隔符的情况。更多的人在看例子的时候错误的理解了delim的作用。

  5.要分解的字符串的第一个字符是分隔符。

  第一个字符是分隔符,这不是很特殊的情况。按照常规的分解思路,字符串是可以正确分解的。

  我想解释的是strtok采取了比常规更快的方式来处理这种情况。

  如上例所示。逗号分隔的字符串 Fred male 25 只需调用一次即可获得,而f前的,则被忽略。可以看出strtok在调用时忽略了起始位置开头的分隔符。这一点可以从strtok的源代码中得到证实。

  6.不能将字符串常量传递给第一个参数!

  本文中的所有示例都将源字符串保存为字符串数组变量。如果将源字符串定义为字符串常量,可以想象程序会抛出异常,因为strtok函数试图修改源字符串的值。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: