• 递归是会更秀strtok


    前几天发的字符串反转题目,后面有一个新同学用了递归的方法来实现,看了下,真的是很秀。

    之前字符串反转的题目

    代码如下

    1. #include "stdio.h"
    2. #include "string.h"
    3. char input[] = {"the sky is blue cris 1212321 apple"};
    4. void reverse(char *s,char *delim) { 
    5.     char* temp = strtok(s,delim);
    6.     if(temp != NULL) {
    7.         reverse(NULL,delim);
    8.         printf("%s ",temp); 
    9.     }
    10. }
    11. int main() { 
    12.  printf("%s\n",input); 
    13.  reverse(input," ");
    14.  return 0;
    15. }

    strtok是一个字符串分割函数,但是这个函数估计很多人还不明白他的用法。

    strtok函数解释

    char *strtok(char s[], const char *delim)

    把输入的字符串s分解成为一组字符串。

    delim 为分割字符串,注意这里是字符串。

    首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL

    例如:

    1. #include "stdio.h"
    2. #include "string.h"
    3. char input[] = {"the sky is blue cris 1212321 apple"};
    4. int main() {
    5.  char *temp = NULL; 
    6.  printf("%s\n",input); 
    7.  temp = strtok(input," ");
    8.  printf("input=%s,temp=%s\n", input, temp);
    9.  temp = strtok(NULL," ");
    10.  printf("input=%s,temp=%s\n", input, temp);
    11.  return 0;
    12. }
    372d40f1c2cb5d94894a6393297e47c6.png

    头文件

    #include<string.h>

    使用详细说明

    • 开始

    strtok 找到需要分割的字符串delim后,会把这个delim设置成\0 ,这从上面的实例也可以看出来,分割之后,我们再用printf输出会在第一个分割字符串位置停止输出。

    • 结束

    当字符串查找到末尾时,函数会返回NULL,所以我们可以用NULL来判断函数执行是否结束。

    • 注意

    用这个函数处理之后会破坏原来字符串中的内容,第一次分割之后,原字符串s是分割完成之后的第一个字符串。

    strtok函数源码

    1. char *
    2. strtok_apple(
    3.  register char *s,
    4.  register const char *delim)
    5. {
    6.  register char *spanp;
    7.  register int c, sc;
    8.  char *tok;
    9.  static char *last;
    10.  if (s == NULL && (s = last) == NULL)
    11.   return (NULL);
    12.  /*
    13.   * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
    14.   */
    15. cont:
    16.  c = *s++;
    17.  for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
    18.   if (c == sc)
    19.    goto cont;
    20.  }
    21.  if (c == 0) {  /* no non-delimiter characters */
    22.   last = NULL;
    23.   return (NULL);
    24.  }
    25.  tok = s - 1;
    26.  /*
    27.   * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
    28.   * Note that delim must have one NUL; we stop if we see that, too.
    29.   */
    30.  for (;;) {
    31.   c = *s++;
    32.   spanp = (char *)delim;
    33.   do {
    34.    if ((sc = *spanp++) == c) {
    35.     if (c == 0)
    36.      s = NULL;
    37.     else
    38.      s[-1] = 0;
    39.     last = s;
    40.     return (tok);
    41.    }
    42.   } while (sc != 0);
    43.  }
    44.  /* NOTREACHED */
    45. }

    解释下上面的代码

    1. #include "stdio.h"
    2. #include "string.h"
    3. char input[] = {"the sky is blue cris 1212321 apple"};
    4. void reverse(char *s,char *delim) { 
    5.     char* temp = strtok(s,delim);
    6.     if(temp != NULL) {
    7.         reverse(NULL,delim);
    8.         printf("%s ",temp);//第一次调用的时候会最后输出,最后一次调用不等于空的时候最先输出 
    9.     }
    10. }
    11. int main() { 
    12.  printf("%s\n",input); 
    13.  reverse(input," ");
    14.  return 0;
    15. }

    如果递归理解不是很明白,可以用for来输出看看

    1. #include "stdio.h"
    2. #include "string.h"
    3. char input[] = {"the sky is blue cris 1212321 apple"};
    4. int main() {
    5.  char * output[1024]; 
    6.  int len = 0
    7.  
    8.  printf("%s\n",input);
    9.  
    10.  char* temp = strtok(input," "); 
    11.  
    12.  for (len=0;temp!=NULL;temp = strtok(NULL," "),++len) {
    13.   output[len] = temp;
    14.  }
    15.  
    16.  for(;len--;) {
    17.   printf("%s ", output[len]);
    18.  }
    19.  return 0;
    20. }
    1e3fafe1d75fe753815b52278b256386.png

    3dd1809b725e5684d6cfde13ee9bc856.gif

  • 相关阅读:
    快速提升中小企业销售效率的5个自动化小技巧
    AOP简单实现
    新媒体数据分析:新媒体运营主要做什么?
    HTML数字倒计时效果附源码
    广州某机械制造企业生产工序管理系统解决方案
    准备pmp考试第10天
    强大的PubMed插件Scholarscope
    你的librosa和scikit-learn打架了吗?
    python 字符串
    源码解析SpringMVC处理请求的完整流程
  • 原文地址:https://blog.csdn.net/weiqifa0/article/details/125476488