一、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';
}
浙公网安备 33010602011771号