c中字符串分割函数strtok_c strtok 截取字符串填到一个结构中

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

#define INFO_MAX_SZ 255

int main()

{

int in=0;

char buffer[INFO_MAX_SZ]=“Fred male 25,John male 62,Anna female 16”;

char *p[20];

char *buf=buffer;

while((p[in]=strtok(buf,“,”))!=NULL) {

buf=p[in];

while((p[in]=strtok(buf," "))!=NULL) {

in++;

buf=NULL;

}

p[in++]=“***”; //表现分割

buf=NULL; }

printf(“Here we have %d strings\n”,i);

for (int j=0; j<in; j++)

printf(“>%s<\n”,p[j]);

return 0;

}

这个程序输出为:

Here we have 4 strings

Fred<

male<

25<

***<

这只是一小段的数据,并不是我们需要的。但这是为什么呢? 这是因为strtok使用一个static(静态)指针来操作数据,让我来分析一下以上代码的运行过程:

红色
为strtok的
内置指针指向的位置

蓝色
为strtok对字符串的
修改

  1. "
    F
    red male 25,John male 62,Anna female 16" //外循环

  2. “Fred male 25
    \0
    J
    ohn male 62,Anna female 16” //进入内循环

3.    “Fred
\0
m
ale 25\0John male 62,Anna female 16”

4.    “Fred\0male
\0
2
5\0John male 62,Anna female 16”

5 “Fred\0male\025
\0
John male 62,Anna female 16” //内循环遇到"\0"回到外循环

6   “Fred\0male\025
\0
John male 62,Anna female 16” //外循环遇到"\0"运行结束。

  1. 使用strtok_r

在这种情况我们应该使用strtok_r, strtok reentrant.

char *strtok_r(char *s, const char *delim, char **ptrptr);

相对strtok我们需要为strtok提供一个指针来操作,而不是像strtok使用配套的指针。

代码:

QUOTE:

#include<stdio.h>

#include<string.h>

#define INFO_MAX_SZ 255

int main()

{

int in=0;

char buffer[INFO_MAX_SZ]=“Fred male 25,John male 62,Anna female 16”;

char *p[20];

char *buf=buffer;

char *outer_ptr=NULL;

char *inner_ptr=NULL;

while((p[in]=strtok_r(buf,“,”,&outer_ptr))!=NULL) {

buf=p[in];

while((p[in]=strtok_r(buf," ",&inner_ptr))!=NULL) {

in++;

buf=NULL;

}

p[in++]=“***”;

buf=NULL; }

printf(“Here we have %d strings\n”,i);

for (int j=0; jn<i; j++)

printf(“>%s<\n”,p[j]);

return 0;

}

这一次的输出为:

Here we have 12 strings

Fred<

male<

25<

***<

John<

male<

62<

***<

Anna<

female<

16<

***<

让我来分析一下以上代码的运行过程:

红色
为strtok_r的
outer_ptr指向的位置

紫色
为strtok_r的
inner_ptr指向的位置

蓝色
为strtok对字符串的
修改

  1. "
    F
    red male 25,John male 62,Anna female 16" //外循环

  2. "
    F
    red male 25
    \0
    J
    ohn male 62,Anna female 16"//进入内循环

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

15458)]
[外链图片转存中…(img-58V4k3KC-1715766215458)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值