c语言中通过分隔符取字符串,C语言中通过分隔符来截取字符串

最近在工作中要实现这样一个功能:

从一个文本文件中按行读取数据,一行数据中每一列都可能含有空格,所以你要把空格给截取出来。列之间是通过TAB键分割的。

我在一开始使用了C的库函数strtok这个函数。

先介绍一下strtok这个函数原型:

char *strtok(char *src, char *flag)

参数一是你要截取的字符串,参数2是字符串中的分隔符。

看一下linux的man手册是如何结束这个函数的功能的:

这个函数的作用是从字符串中提取出分隔符号。

也就说一个字符串如果是用/t作为分隔符的话,你使用这个函数后得到的是一个去掉了/t的字符串,返回了这个字符串的首地址。

在字符串中原分隔符的位置,使用/0替换了原来的分隔符。所以你在使用的时候要注意了,如果你的目标字符串包含了多个分隔符,你应该这样使用这个函数:

char *tmp="abc123ABC"; //分隔符是/t

char *p=strtok(tmp,"/t"); //p指向了abc

char *p1=strtok(NULL, "/t"); //p1指向了123

char *p2=strtok(NULL, "/t"); //p2指向了ABC

但是如果你遇到了这样的情况,那么这个函数就不会起作用了:

char *tmp="abcABC"; //分隔符是/t,注意第二个是空格

char *p=strtok(tmp,"/t"); //p指向了abc

char *p1=strtok(NULL, "/t"); //p1指向了ABC,不会取出你想要的空格

char *p2=strtok(NULL, "/t"); //p2会报错的

还有就是这个函数不是线程安全的,Linux推荐使用函数strtok_r函数。

显然这个函数没有办法实现我要的功能的,于是我就自己写了一个函数来实现这个功能:

我的函数如下:

void myStrtok(char *tmp, char flag, char **p1, char **p2, char **p3)

{

//三个二级指针必须要在调用函数中定义,这样在这个函数内的赋值才能传出去。

int i,j;

int a[3]; //这个地方有一个不好的地方就是这个数组的定义随着截取出串的多少你需要改动,最好是自己传入一个数组,这样就好了

char *ptr=tmp;

while(*tmp)

{

if(*tmp==flag)

{

a[j++]=i; //记录分割符出现的位置

*tmp='/0';//把原来的分割符替换为'/0'

}

tmp++;

i++;

}

*p1=ptr;

*p2=ptr+a[0]+1;

*p3=ptr+a[1]+1;

}

在函数外部,你可以定义三个一级指针,如 char *p1, char *p2, char *p3,

这样就可以使用了上面的函数了:

myStrtok(tmp, '/t', &p1, &p2, &p3);

这样的话,你就可以截取到每一个被分隔符分割的字符串了,包括空格.

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值