免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: olivehht
打印 上一主题 下一主题

C语言求字符串分割的函数 [复制链接]

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
11 [报告]
发表于 2012-06-12 13:23 |只看该作者
i think that the strstr function will do this work perfectly..

论坛徽章:
0
12 [报告]
发表于 2012-06-12 15:00 |只看该作者
回复 9# Sevk


    不是怪异,而是允许你第二次再指定其他的分隔符,如果和第一次一样就可以用NULL。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
13 [报告]
发表于 2012-06-12 15:02 |只看该作者
olivehht 发表于 2012-06-11 19:40
有一个字符串:ABBBCBBBD,分隔符是BBB或者其他字符串,希望能拆出:A C D
本来想自己写的,写不下去了,求 ...

利用strtsr()处理。

论坛徽章:
0
14 [报告]
发表于 2012-06-14 13:48 |只看该作者
我用strtok写的小demo,呵呵,有什么错误希望指出
int iStrtok(const char *sDes,const char *sDelimiter,char *sOutput)
{
        int i = 0;
        char *pCurrent;
        char sTemp[128];
       
       
        pCurrent = NULL;
        memset(sTemp,0x00,sizeof(sTemp));
       
        if(sDes == NULL || strlen(sDes) == 0 || sDelimiter == NULL || strlen(sDelimiter) == 0)
        {
                printf("输入参数为空,Des[%s],Delimiter[%s]\n",sDes,sDelimiter);
                return -1;
        }
       
        strncpy(sTemp,sDes,sizeof(sTemp));
       
        pCurrent = strtok(sTemp,sDelimiter);
        memcpy(sOutput,pCurrent,strlen(pCurrent));
        printf("第%d次分割后得到的数据:[%s]\n",++i,pCurrent);
       
        while(pCurrent = strtok(NULL,sDelimiter))
        {
                memcpy(sOutput + strlen(sOutput),pCurrent,sizeof(pCurrent));
                printf("第%d次分割后得到的数据:[%s]\n",i++,pCurrent);
        }
       
        sOutput[strlen(sOutput)] = '\0';
        /*printf("最终得到的数据:[%s]\n",sOutput);*/
        return 0;
}

论坛徽章:
0
15 [报告]
发表于 2012-06-14 17:31 |只看该作者
伪代码:
A[]= "AXBXXBXXXB"//待检测数组
Record[] //用来记录结果.

  1. j = 0;
  2. t = 0;
  3. Lable1  while (A[i] != NULL && j < 2)
  4.              do  if  A[i] = A[i + 1]
  5.                           then   i ++;
  6.                                      j++;
  7.                    else
  8.                            if j = 0
  9.                              then Record[t++] = A[i] ;
  10.                            else
  11.                              then Record[t++] = A[ i - j];
  12.                              Record[t++] = A[i];
  13. if A[i] != NULL
  14. goto Label1
复制代码

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
16 [报告]
发表于 2012-06-14 20:41 |只看该作者
bignothing 发表于 2012-06-14 13:48
我用strtok写的小demo,呵呵,有什么错误希望指出
int iStrtok(const char *sDes,const char *sDelimiter, ...

可以,但是要注意strtok线程不安全,可以用statok_r来代替。
或者使用stptok。stptok不是标准函数,在网上搜搜,有源码。

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
17 [报告]
发表于 2012-06-15 09:17 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
18 [报告]
发表于 2012-06-15 16:26 |只看该作者
        

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
19 [报告]
发表于 2012-06-18 17:36 |只看该作者
Sevk 发表于 2012-06-15 09:17
strtok线程不安全, 有没有一个列表,列出线程不安全的函数。

没有。
你可以man一下,系统会给你建议。

论坛徽章:
0
20 [报告]
发表于 2012-06-19 11:07 |只看该作者
多线程不安全的函数列表可以参考:

http://kernel.org/doc/man-pages/online/pages/man7/pthreads.7.html
           asctime()
           basename()
           catgets()
           crypt()
           ctermid() if passed a non-NULL argument
           ctime()
           dbm_clearerr()
           dbm_close()
           dbm_delete()
           dbm_error()
           dbm_fetch()
           dbm_firstkey()
           dbm_nextkey()
           dbm_open()
           dbm_store()
           dirname()
           dlerror()
           drand48()
           ecvt() [POSIX.1-2001 only (function removed in POSIX.1-200]
           encrypt()
           endgrent()
           endpwent()
           endutxent()
           fcvt() [POSIX.1-2001 only (function removed in POSIX.1-200]
           ftw()
           gcvt() [POSIX.1-2001 only (function removed in POSIX.1-200]
           getc_unlocked()
           getchar_unlocked()
           getdate()
           getenv()
           getgrent()
           getgrgid()
           getgrnam()
           gethostbyaddr() [POSIX.1-2001 only (function removed in POSIX.1-200]
           gethostbyname() [POSIX.1-2001 only (function removed in POSIX.1-200]
           gethostent()
           getlogin()
           getnetbyaddr()
           getnetbyname()
           getnetent()
           getopt()
           getprotobyname()
           getprotobynumber()
           getprotoent()
           getpwent()
           getpwnam()
           getpwuid()
           getservbyname()
           getservbyport()
           getservent()
           getutxent()
           getutxid()
           getutxline()
           gmtime()
           hcreate()
           hdestroy()
           hsearch()
           inet_ntoa()
           l64a()
           lgamma()
           lgammaf()
           lgammal()
           localeconv()
           localtime()
           lrand48()
           mrand48()
           nftw()
           nl_langinfo()
           ptsname()
           putc_unlocked()
           putchar_unlocked()
           putenv()
           pututxline()
           rand()
           readdir()
           setenv()
           setgrent()
           setkey()
           setpwent()
           setutxent()
           strerror()
           strsignal() [Added in POSIX.1-2008]
           strtok()
           system() [Added in POSIX.1-2008]
           tmpnam() if passed a non-NULL argument
           ttyname()
           unsetenv()
           wcrtomb() if its final argument is NULL
           wcsrtombs() if its final argument is NULL
           wcstombs()
           wctomb()
这些函数都是线程不安全的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP