记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。

LiSun

记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、x_strtok

1.定义

分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。在头文件#include<string.h>中。

2.原型

char *strtok(char s[], const char *delim);

3.说明

(1)包含的分割字符时

当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。

(2)返回值

从s开头开始的一个个被分割的串。当s中的字符查找到末尾时,返回NULL。如果查找不到delim中的字符时,返回当前strtok的字符串的指针。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

(3)注意

需要注意的是,使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。第一次分割之后,原字符串str是分割完成之后的第一个字符串,剩余的字符串存储在一个静态变量中,因此多线程同时访问该静态变量时,则会出现错误。

示例代码


#include <string.h>

#include "x_strtok.h"

char *_x_strtok_s(char *s, const char *delim, char **lasts, int skip_leading_delim)
{
    register char *spanp;
    register int c, sc;
    char *tok;

    if (s == NULL && (s = *lasts) == 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) {
            if (skip_leading_delim) {
                goto cont;
            } else {
                *lasts = s;
                s[-1] = 0;
                return (s - 1);
            }
        }
    }

    if (c == 0) {       /* no non-delimiter characters */
        *lasts = 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;
                *lasts = s;
                return (tok);
            }
        } while (sc != 0);
    }
    /* NOTREACHED */
}

char *x_strtok_s(char *s, const char *delim, char **lasts)
{
    return _x_strtok_s(s, delim, lasts, 1);
}



#ifndef _X_STRTOK_H_
#define _X_STRTOK_H_

char *x_strtok_s(char *s, const char *delim, char **lasts);

#endif // _X_STRTOK_H_

二、16进制整数转字符串

示例代码

static void hex_to_str(uint8_t *source, uint32_t len, uint8_t *target)
{
    uint8_t ddl, ddh;
    uint32_t i;

    for (i = 0; i < len; i++)
    {
        ddh = ('0' + source[i] / 16);
        ddl = ('0' + source[i] % 16);

        if (ddh > '9')
            ddh = (ddh + ('a' - '9' - 1));
        if (ddl > '9')
            ddl = (ddl + ('a' - '9' - 1));

        target[i * 2] = ddh;
        target[i * 2 + 1] = ddl;
    }
    target[len] = '\0';
}
posted on 2021-04-15 10:19  嵌入式单片机实验室  阅读(47)  评论(0)    收藏  举报  来源
记录开发过程中的问题和功能。毕se代做,小家电开发。 收徒带做企业级项目,帮助毕业生和转行人员顺利找到工作。