string.h#

string.h提供了一系列内存和字符串操作函数.

待办事项:

  1. 需要进行测试, 以测试函数正确性

  2. 实现debug.h后需要给每个指针添加 NULL 检查

Author

Shihong Wang (jack4shihong@gmail.com)

Version

0.1

Date

2023-04-08

Copyright

Copyright Shihong Wang (c) 2023 with GNU Public License V3.0

Warning

为了避免编译时编译器使用系统的string.h库, 编译时需要为GCC指定-nostdinc选项, 详见根目录下的Makefile

Functions

size_t memset(void *dst, byte value, size_t size)#

memsetdet_起始的size个字节的内存单元的值设置为value

Parameters:
  • dst – 起始地址

  • value – 设置的值

  • size – 要设置多少个字节

Returns:

size_t 成功设置的字节数

size_t strmset(void *dst, char value, size_t size)#

strmset是针对字符串复制的安全实现,避免了字符串复制时可能存在的缓存区溢出,det_起始的size个字节的内存单元的值设置为value

Parameters:
  • dst – 起始地址

  • value – 设置的值

  • size – 要设置多少个字节

Returns:

size_t 成功设置的字节数

size_t memcpy(void *dst, const void *src, size_t size)#

memcpysrc起始的size个内存单元的值(以字节计算)复制到dst起始的size个内存单元中

Warning

memcpy不会进行长度检查, 注意srcdst的长度, 以避免溢出

Parameters:
  • dst – 被复制的内存区域的起始地址

  • src – 复制到的内存区域的起始地址

  • size – 复制的字节数

Returns:

size_t 复制的字节数

size_t memmove(void *dst, const void *src, size_t size)#

memmove - Copy a block of memory, handling overlaps

Note

memcpy() 不同,memmove() 处理重叠缓冲区。 复制发生的过程就像 src 中的字节首先被复制到 不与 src 或 dest 和字节重叠的临时缓冲区 然后从临时缓冲区复制到目标。

Note

此函数用于代替 memcpy() 在可能重叠的内存块之间进行复制。

Parameters:
  • dst – Destination buffer

  • src – Source buffer

  • size – Size of buffer

Returns:

size_t return the copied char num

int8_t memcmp(const void *a, const void *b, size_t size)#

memcmp用于比较两个分别以ab为起始地址的的size个字节的内存区域的值

Parameters:
  • a – 要比较的第一个内存区域的地址

  • b – 要比较的第二个内存区域的地址

  • size – 要比较的字节数

Returns:

int8_t 比较的结果:

  • a>b, 则返回1

  • a=b, 则返回0

  • a<b, 则返回-1

char *strcpy(char *dst, const char *src)#

strcpy复制src指向的以’\0’结尾的字符串到dst指向的字符串去中去

Warning

strcpy不会进行长度检查, 注意srcdst的长度, 以避免溢出

Parameters:
  • dst – 将要复制到的内存地址

  • src – 被复制的字符串

Returns:

char* 返回dst的首地址

size_t strlen(const char *str)#

strlen返回以’\0’结尾的字符串的长度

Parameters:

str – 要获取长度的字符串

Returns:

size_t 字符串的长度

int8_t strcmp(const char *a, const char *b)#

strcmp比较两个字符串

Parameters:
  • a – 要比较的第一个字符串

  • b – 要比较的第二个字符串

Returns:

int8_t 返回比较的结果

  • a>b, 则返回1

  • a=b, 则返回0

  • a<b, 则返回-1

char *strcat(char *dst, const char *src)#

strcat用于将字符串src拼接到dst

Warning

strcat不会进行长度检查, 注意srcdst的长度, 以避免溢出

Parameters:
  • dst – 将被拼接到的字符串

  • src – 将被拼接的字符串

Returns:

char* 返回dst的首地址

char *strchr(const char *str, const uint8_t ch)#

strchr返回字符串从左往右第一次出现字符ch的地址

Note

strchr相当于返回字符ch第一次出现的地址

Parameters:
  • str – 被搜索的字符串

  • ch – 要搜索的字符

Returns:

char* 指向字符的指针,

  • 若字符ch在字符串str中, 则返回字符串第一个ch的地址

  • 若字符ch不在字符串str中, 则返回 NULL

char *strrchr(const char *str, const uint8_t ch)#

strrchr返回反向字符串第一次出现字符ch的地址

Note

strrchr相当于返回字符ch最后一次出现的地址

Parameters:
  • str – 被搜索的字符串

  • ch – 要搜索的字符

Returns:

char*

  • 若字符ch在字符串str中, 则返回反向字符串第一个ch的地址

  • 若字符ch不在字符串str中, 则返回 NULL

size_t strchrs(const char *str, const uint8_t ch)#

strchrs返回字符串str中字符ch出现的次数

Parameters:
  • str – 要被搜索的字符串

  • ch – 要查询的字符

Returns:

size_t 字符ch在字符串str中出现的次数

size_t strslice(const char *src, char *dst, int64_t start, int64_t len)#

‘strslice’从src字符串中截取从start的len个字节写入start中;同时检查是否越界,避免缓存区溢出;

Parameters:
  • str – 要被截取的字符串

  • dst – 要被写入的字符串

  • start – 开始的下标

  • len – 要截取的长度

Returns:

size_t 成功截取的长度

void encrypt_decrypt(char *str, int len, char key)#

‘encrypt_decrypt’函数通过使用一个异或操作对字符串进行加密,由于异或具有自反的性质没所以该函数同样可以用于解密!

Parameters:
  • str – 要被加密的字符串

  • len – 需要被加密的长度

  • key – 加密KEY

Returns:

void return

int regu_match(const char *str, const char *pattern, int match_pos[])#
void regu_replace(char *str, const char *pattern, const char *replacement, int max_len)#

‘regu_replac’函数通过使用正则表达式对字符串中特定字符串进行一个替换;

Parameters:
  • str – 需要被操作的字符串

  • pattern – 正则匹配模式

  • replacement – 替换为的字符

  • max_len – 最大处理长度

Returns:

void return