递归是会更秀strtok
嵌入式Linux
共 4665字,需浏览 10分钟
· 2022-06-28
前几天发的字符串反转题目,后面有一个新同学用了递归的方法来实现,看了下,真的是很秀。
代码如下
#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;
}
头文件
#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;
}
评论
周鸿祎是真牛逼
最近在各个视频平台,我的推荐信息流上一定会出现红衣教主周鸿祎的身影,俨然是新一代的顶流IP网红,还是自己贼有钱的那种。不得不说,周鸿祎是真牛逼,他是懂得学习的。年初的时候,他就发文:“如今已是网红时代,我现在已经拜了俞敏洪为师,在学习如何当网红,每天勤奋的发短视频”。“有时候也在劝很多亚布力大哥级
公子龙
1
Windows格式化对话框是一个使用了30年的 “临时解决方案”
戴夫-普卢默(Dave Plummer)是微软的资深工程师,曾创造了任务管理器、Windows 弹球、原生 ZIP 支持(微软出钱买断该功能后,他用这笔钱购买了一辆红色克尔维特)等传奇。近日他在自己的 X 账户上分享了创建 "格式化" 对话框的故事 —— 称其是一个使用了长达 30 年的 “临时解决
开源Linux
0
OpenAI的Sora竟然造假:生成的AI大片只有1%的AI,剩下的99%是人工!
点蓝色字关注“机器学习算法工程师”设为星标,干货直达!啊?Sora火爆短片《气球人》,也“造假”了???背后艺术家团队的最新揭秘,可谓一石激起千层浪:原来,视频画面并非完全由AI生成,其中有大量视觉效果需要人类后期实现。be like:这下网友不干了,合着大家伙儿跟OpenAI玩真心,OpenAI背
机器学习算法工程师
1
新规!不授予学位!博士毕业更难了?
来源:阿秒富友研究院编辑:学妹据4月22日科技日报消息,全国人大常委会法工委发言人杨合庆在近日举行的记者会上表示,即将提请十四届全国人大常委会第九次会议审议的学位法草案二次审议稿将进一步完善学位授予条件和程序,并对保障博士学位质量作出专门规定。杨合庆介绍,2023年8月,十四届全国人大常委会第五次会
机器学习初学者
0
大量 Java 开源项目停更...
点击关注公众号,Java 干货及时推送↓推荐阅读:投了 100 多份简历后…出品 | OSC开源社区(ID:oschina2013)Sonatype 发布了最新的一份《软件供应链状况》报告,深入探讨了如何在充满选择的世界中定义更好的软件,并探讨人工智能 (AI) 对软件开发的深远
Java技术栈
0
李彦宏:开源大模型不如闭源,后者会持续领先;周鸿祎:“开源不如闭源” 的言论是胡说八道
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁0、李彦宏:开源大模型不如闭源,后者会持续领先当今
源码共读
0
宇宙的尽头是编制?985高校硕士拟聘遗体火化工疯传!
本文来源:大皖新闻、潇湘晨报、南都街谈、超级数学建模、创业邦4月22日,广州市民政局网站发布的《广州市民政局直属事业单位2023年第一次公开招聘工作人员拟聘用人员公示(第一批)》引发舆论关注。名单中有毕业于香港中文大学的刘某拥有研究生学历,专业为哲学(佛学研究),另外二人本科分别毕业于华南理工大学建
机器学习初学者
0