免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 12218 | 回复: 6
打印 上一主题 下一主题

[C] 如何用c语言实现strtok算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-27 12:52 |只看该作者 |倒序浏览
就是自己编写一个算法实现strtok函数
看过别的字符串函数实现算法,不知道这个怎么实现
特别想知道
比如name=grubby把“=”前后分割 用value=strtok(line,“=”);如果不用strtok如何实现呢?
可不可以把“=”号前面的放到一个数组里,“=”后面的放到一个数组里
然后用strchr函数……

论坛徽章:
0
2 [报告]
发表于 2005-10-27 16:47 |只看该作者

如何用c语言实现strtok算法

strtok不是用c写的吗?

看一下它的源码

论坛徽章:
0
3 [报告]
发表于 2005-10-27 20:47 |只看该作者

如何用c语言实现strtok算法

我知道他不是用c写的 但我想可以用c的算法实现
就像字串長度可以这样写一样

int strlen(char s[]) {
    int i;
    for (i = 0; s != 0; i++) ;
    return i;
}

那用c如何实现strtok的功能呢?

论坛徽章:
0
4 [报告]
发表于 2005-10-27 23:18 |只看该作者

如何用c语言实现strtok算法

char *strtok(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);
               
cont:
        c = *s++;
        for (spanp = (char *)delim; (sc = *spanp++) != 0 {
                if (c == sc)
                        goto cont;
        }

        if (c == 0) {
                last = NULL;
                return (NULL);
        }
        tok = s - 1;

        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);
        }
}

论坛徽章:
0
5 [报告]
发表于 2005-10-28 08:08 |只看该作者

如何用c语言实现strtok算法

原帖由 "jeffwang8001" 发表:
strtok不是用c写的吗?

看一下它的源码

我觉的无聊,有现场成的不用.

论坛徽章:
0
6 [报告]
发表于 2005-10-28 15:57 |只看该作者

如何用c语言实现strtok算法

可不可加上注释阿
我有点看不明白 [/quote]

论坛徽章:
0
7 [报告]
发表于 2008-09-09 07:45 |只看该作者
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

/*mystrtok is the same as the function "strtok" in string.h*/
char *mystrtok(register char *s, register const char *delim);
int main(void) {
       
        printf("---mystrtok---\n");
        char myinput[16] = "abcde,fgh";
        char *s;
        s = mystrtok(myinput, "c,h");
        printf("%s\n", s);
        s = mystrtok(NULL, "c,h");
        if (s)
                printf("%s\n", s);
        s = mystrtok(NULL, ",");
        if (s)
                printf("%s\n", s);
        printf("%s\n", myinput);

        return EXIT_SUCCESS;
}

char *mystrtok(register char *s, register const char *delim) {
        static char *last;
        char *tok;
        char *ucdelim;

        /*(1)s为空,并且上次剩余值也为空,则直接返回NULL,否则s为last或当前值中有值的一方*/
        /*if (s == NULL && (s = last) == NULL)
                return NULL;*/
        /*(2)以上内容与下面等价:
                 下面意为:如果s==NULL的时候,s则为last(上次执行该项的时候的剩余值);
                 若这时候s还为空(即上次没有剩余),则返回NULL。
         */

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

        /*(3)也意为:若后续值为NULL则不进行操作,否则继续操作。
                 其中,后续值的界定方法为: 若last不为空的时候,则s为last,否则为输入值
         * */
        /*
        if(last != NULL)
                s = last;
        else if(s == NULL)
                return NULL;*/

        tok = s;

        int found = 0;
        while (!found && *s != '\0') {
                ucdelim = (char *) delim;
                while (*ucdelim) {
                        if (*s == *ucdelim) {
                                found = 1;
                                *s = '\0';
                                last = s + 1;
                                break;
                        }
                        ucdelim++;
                }
                if (!found)
                        s++;
        }

        return tok;
}


/*********************************************************************/
/***
*strtok.c - tokenize a string with given delimiters
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines strtok() - breaks string into series of token
*       via repeated calls.
*
*******************************************************************************/

#include <cruntime.h>
#include <string.h>
#ifdef _SECURE_VERSION
#include <internal.h>
#else  /* _SECURE_VERSION */
#include <mtdll.h>
#endif  /* _SECURE_VERSION */

/***
*char *strtok(string, control) - tokenize string with delimiter in control
*
*Purpose:
*       strtok considers the string to consist of a sequence of zero or more
*       text tokens separated by spans of one or more control chars. the first
*       call, with string specified, returns a pointer to the first char of the
*       first token, and will write a null char into string immediately
*       following the returned token. subsequent calls with zero for the first
*       argument (string) will work thru the string until no tokens remain. the
*       control string may be different from call to call. when no tokens remain
*       in string a NULL pointer is returned. remember the control chars with a
*       bit map, one bit per ascii char. the null char is always a control char.
*
*Entry:
*       char *string - string to tokenize, or NULL to get next token
*       char *control - string of characters to use as delimiters
*
*Exit:
*       returns pointer to first token in string, or if string
*       was NULL, to next token
*       returns NULL when no more tokens remain.
*
*Uses:
*
*Exceptions:
*
*******************************************************************************/

#ifdef _SECURE_VERSION
#define _TOKEN *context
#else  /* _SECURE_VERSION */
#define _TOKEN ptd->_token
#endif  /* _SECURE_VERSION */

#ifdef _SECURE_VERSION
char * __cdecl strtok_s (
        char * string,
        const char * control,
        char ** context
        )
#else  /* _SECURE_VERSION */
char * __cdecl strtok (
        char * string,
        const char * control
        )
#endif  /* _SECURE_VERSION */
{
        unsigned char *str;
        const unsigned char *ctrl = control;

        unsigned char map[32];
        int count;

#ifdef _SECURE_VERSION

        /* validation section */
        _VALIDATE_RETURN(context != NULL, EINVAL, NULL);
        _VALIDATE_RETURN(string != NULL || *context != NULL, EINVAL, NULL);
        _VALIDATE_RETURN(control != NULL, EINVAL, NULL);

        /* no static storage is needed for the secure version */

#else  /* _SECURE_VERSION */

        _ptiddata ptd = _getptd();

#endif  /* _SECURE_VERSION */

        /* Clear control map */
        for (count = 0; count < 32; count++)
                map[count] = 0;

        /* Set bits in delimiter table */
        do {
                map[*ctrl >> 3] |= (1 << (*ctrl & 7));
        } while (*ctrl++);

        /* Initialize str */

        /* If string is NULL, set str to the saved
         * pointer (i.e., continue breaking tokens out of the string
         * from the last strtok call) */
        if (string)
                str = string;
        else
                str = _TOKEN;

        /* Find beginning of token (skip over leading delimiters). Note that
         * there is no token iff this loop sets str to point to the terminal
         * null (*str == '\0') */
        while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )
                str++;

        string = str;

        /* Find the end of the token. If it is not the end of the string,
         * put a null there. */
        for ( ; *str ; str++ )
                if ( map[*str >> 3] & (1 << (*str & 7)) ) {
                        *str++ = '\0';
                        break;
                }

        /* Update nextoken (or the corresponding field in the per-thread data
         * structure */
        _TOKEN = str;

        /* Determine if a token has been found. */
        if ( string == str )
                return NULL;
        else
                return string;
}

[ 本帖最后由 rq8y 于 2008-9-9 07:46 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP