首页 > 其他分享 >递归是会更秀strtok

递归是会更秀strtok

时间:2022-10-19 14:01:15浏览次数:46  
标签:递归 temp strtok delim char input NULL 更秀


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

之前字符串反转的题目

代码如下

#include "stdio.h"
#include "string.h"
char input[] = {"the sky is blue cris 1212321 apple"};

void reverse(char *s,char *delim) {
char* temp = strtok(s,delim);
if(temp != NULL) {
reverse(NULL,delim);
printf("%s ",temp);
}
}


int main() {
printf("%s\n",input);
reverse(input," ");
return 0;
}

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

​strtok​​函数解释

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

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

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

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

例如:

#include "stdio.h"
#include "string.h"
char input[] = {"the sky is blue cris 1212321 apple"};

int main() {
char *temp = NULL;
printf("%s\n",input);
temp = strtok(input," ");
printf("input=%s,temp=%s\n", input, temp);
temp = strtok(NULL," ");
printf("input=%s,temp=%s\n", input, temp);
return 0;
}


递归是会更秀strtok_字符串

头文件

​#include<string.h>​

使用详细说明

  • 开始

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

  • 结束

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

  • 注意

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

strtok函数源码

char *
strtok_apple(
register char *s,
register const char *delim)
{
register char *spanp;
register int c, sc;
char *tok;
static char *last;


if (s == NULL && (s = last) == NULL)
return (NULL);

/*
* Skip (span) leading delimiters (s += strspn(s, delim), sort of).
*/
cont:
c = *s++;
for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
if (c == sc)
goto cont;
}

if (c == 0) { /* no non-delimiter characters */
last = NULL;
return (NULL);
}
tok = s - 1;

/*
* Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
* Note that delim must have one NUL; we stop if we see that, too.
*/
for (;;) {
c = *s++;
spanp = (char *)delim;
do {
if ((sc = *spanp++) == c) {
if (c == 0)
s = NULL;
else
s[-1] = 0;
last = s;
return (tok);
}
} while (sc != 0);
}
/* NOTREACHED */
}

解释下上面的代码

#include "stdio.h"
#include "string.h"
char input[] = {"the sky is blue cris 1212321 apple"};

void reverse(char *s,char *delim) {
char* temp = strtok(s,delim);
if(temp != NULL) {
reverse(NULL,delim);
printf("%s ",temp);//第一次调用的时候会最后输出,最后一次调用不等于空的时候最先输出
}
}


int main() {
printf("%s\n",input);
reverse(input," ");
return 0;
}

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

#include "stdio.h"
#include "string.h"
char input[] = {"the sky is blue cris 1212321 apple"};

int main() {
char * output[1024];
int len = 0;

printf("%s\n",input);

char* temp = strtok(input," ");

for (len=0;temp!=NULL;temp = strtok(NULL," "),++len) {
output[len] = temp;
}

for(;len--;) {
printf("%s ", output[len]);
}
return 0;
}


递归是会更秀strtok_算法_02

递归是会更秀strtok_c语言_03

标签:递归,temp,strtok,delim,char,input,NULL,更秀
From: https://blog.51cto.com/u_15315240/5769789

相关文章

  • Demo33_关于递归
    //递归讲解阶乘的方法5!5*4*3*2*1packagecom.HuanXin.Fan_Fa_5;publicclassDemo06{publicstaticvoidmain(String[]args){//递归思想inta......
  • Vue面试题35:什么是递归组件?(总结自B站up主‘前端杨村长’视频,仅供自用学习)
    分析递归组件我们用的比较少,但是在Tree、Menu这类组件中会被用到;体验组件通过组件名称引用它自己,这种情况就是递归组件<template><li><div>{{model.......
  • 递归
    递归概述递归:指在当前方法内调用自己的这种现象递归的分类:递归分为两种,直接递归和间接递归直接递归称为方法自身调用自己间接递归可以A方法调用B方法B方法调用C......
  • 递归-练习使用递归计算1-n直接的和
    使用递归计算1-n直接的和分析:num的类和=num+(num-1)的类和所以可以把类和的操作定义成一个方法递归调用代码:publicstaticvoidmain(String[]args){intn=3;......
  • 递归-练习递归求阶乘、递归归打印多个目录、综合练习文件搜索
    练习递归求阶乘阶乘:所有小于及等于该数的正整数的积n的阶乘:n!=n*(n-1)*.....*3*2*1分析:这与类和类相似只不过换成了乘法运算学员可以自己练习需要注意阶乘......
  • 第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java
    第二季:5值传递和引用传递【Java面试题】​​前言​​​​推荐​​​​值传递​​​​说明​​​​题目​​​​24TransferValue醒脑小练习​​​​第二季:5公平锁/非公平锁/......
  • 递归函数
    目录递归函数递归函数递归函数就是直接或间接调用函数自身的函数,当我们使用这种函数的时候,并不会出现预料之中的死循环,当循环次数达到1000左右就会被解释器强行停止,虽然......
  • PHP 存在不受控制的递归漏洞
    PHP存在不受控制的递归漏洞在PHP受影响版本内,phar解压缩器代码将递归解压缩“quines”gzip文件,从而导致无限循环。攻击者会利用此漏洞导致服务器资源耗尽。影响......
  • 递归与分治法实现快速排序算法
    ​本人CSDN链接:http://t.csdn.cn/Wt0Nm提示:首先了解并明白递归与分治法的快速排序文章目录 前言递归与分治法实现快速排序算法,输入一串以英文字符逗号隔开的数......
  • 层序遍历递归删除二叉树
    层序遍历递归删除二叉树什么是递归删除?从叶节点开始向根节点的方向逐层删除。直观的讲,对于以下二叉树,递归删除的次序为:f->g->h->i->d->e->b->c->a递......