20个string库常用的函数,你用过几个

string.h中的这些函数是C语言中处理字符串的基本工具,它们在串口解析和数据传输中非常重要,因为这些操作经常涉及到字符串的复制、比较、查找和修改。理解这些函数的用法和潜在的风险,如缓冲区溢出,对于编写安全和高效的代码至关重要。下面我将详细解释string.h中的一些常见函数。

1. memcpy

原型:

void* memcpy(void* dest, const void* src, size_t n);

功能:

memcpy函数用于将src所指向的内存区域的n个字节复制到dest所指向的内存区域。这个函数适用于任何类型的内存复制,不仅仅是字符串。

注意事项:

  • 确保dest有足够的空间来容纳从src复制的n个字节,否则可能会导致缓冲区溢出。
  • src和dest所指向的内存区域不能重叠,否则行为未定义。

2. memmove

原型:

void* memmove(void* dest, const void* src, size_t n);

功能:

memmove函数与memcpy类似,也是将src所指向的n个字节复制到dest所指向的内存区域。但是,memmove可以处理src和dest内存区域重叠的情况。

注意事项:

  • 即使src和dest内存区域重叠,memmove也能正确处理,不会覆盖重要的数据。
  • 在不确定内存区域是否重叠的情况下,使用memmove更安全。

3. memset

原型:

void* memset(void* dest, int ch, size_t n);

功能:

memset函数将dest所指向的内存区域的前n个字节设置为ch指定的值(通常是一个字符)。这个函数常用于初始化内存。

注意事项:

  • ch参数是一个int类型,但在复制到内存时,它会被转换为unsigned char。
  • 使用memset可以快速清零一块内存,例如memset(dest, 0, n);

4. strcpy

原型:

char* strcpy(char* dest, const char* src);

功能:

strcpy函数将src字符串(包括终止的空字符’\0’)复制到dest所指向的内存区域。

注意事项:

  • 确保dest有足够的空间来容纳src字符串,包括终止的空字符,否则会导致缓冲区溢出。
  • src和dest不能指向相同的内存区域。

5. strncpy

原型:

char* strncpy(char* dest, const char* src, size_t n);

功能:

strncpy函数将src字符串的前n个字节复制到dest所指向的内存区域。如果src字符串的长度小于n,则剩余的字节用空字符’\0’填充。

注意事项:

  • 如果src字符串的长度大于或等于n,dest可能不会以空字符终止,这可能导致后续操作出现问题。
  • 使用strncpy时需要特别小心,确保dest字符串以空字符终止。

6. strcat

原型:

char* strcat(char* dest, const char* src);

功能:

strcat函数将src字符串(包括终止的空字符’\0’)追加到dest字符串的末尾。

注意事项:

  • 确保dest有足够的空间来容纳追加的src字符串,包括终止的空字符,否则会导致缓冲区溢出。
  • dest必须是一个空终止的字符串。

7. strncat

原型:

char* strncat(char* dest, const char* src, size_t n);

功能:

strncat函数将src字符串的前n个字节追加到dest字符串的末尾,并确保dest以空字符终止。

注意事项:

  • 如果src字符串的长度小于n,dest将包含src的所有字符,并以空字符终止。
  • 如果src字符串的长度大于或等于n,dest将包含src的前n个字节,并以空字符终止。

8. strcmp

原型:

int strcmp(const char* str1, const char* str2);

功能:

strcmp函数比较两个字符串str1和str2,按照字典顺序返回比较结果。

  • 返回值小于0表示str1小于str2
  • 返回值等于0表示str1等于str2
  • 返回值大于0表示str1大于str2

注意事项:

  • 比较是基于字符的ASCII值。
  • 比较直到遇到第一个不匹配的字符或遇到空字符’\0’。

9. strncmp

原型:

int strncmp(const char* str1, const char* str2, size_t n);

功能:

strncmp函数比较两个字符串str1和str2的前n个字节,按照字典顺序返回比较结果。

  • 返回值小于0表示str1的前n个字节小于str2的前n个字节
  • 返回值等于0表示str1的前n个字节等于str2的前n个字节
  • 返回值大于0表示str1的前n个字节大于str2的前n个字节

注意事项:

  • 比较的是前n个字节,不考虑字符串的实际长度。
  • 如果n为0,返回0。

10. strchr

原型:

char* strchr(const char* str, int ch);

功能:

strchr函数在字符串str中查找第一个等于ch的字符,并返回指向该字符的指针。如果未找到,返回NULL。

注意事项:

  • ch参数是一个int,但实际上只使用其最低字节,并且被转换为unsigned char进行比较。
  • 查找包括字符串的终止空字符’\0’。

11. strrchr

原型:

char* strrchr(const char* str, int ch);

功能:

strrchr函数在字符串str中查找最后一个等于ch的字符,并返回指向该字符的指针。如果未找到,返回NULL。

注意事项:

  • ch参数同strchr
  • 同样包括字符串的终止空字符’\0’。

12. strstr

原型:

char* strstr(const char* haystack, const char* needle);

功能:

strstr函数在字符串haystack中查找第一个出现的子字符串needle,并返回指向该子字符串起始位置的指针。如果未找到,返回NULL。

注意事项:

  • 查找是基于字节的精确匹配。
  • needle可以是空字符串,此时返回haystack本身。

13. strtok

原型:

char* strtok(char* str, const char* delim);

功能:

strtok函数用于将字符串str分割为多个 tokens,根据delim参数指定的分隔符。

使用方法:

  • 第一次调用strtok时,str指向要分割的字符串,delim指定分隔符。
  • 后续调用strtok时,str设为NULL,继续从前一次返回的位置开始分割。

注意事项:

  • strtok修改原始字符串,在字符串中插入空字符’\0’来分割tokens。
  • 不是线程安全的,因为它使用静态变量保存状态。

14. strlen

原型:

size_t strlen(const char* str);

功能:

strlen函数计算字符串str的长度,不包括终止的空字符’\0’。

注意事项:

  • 直到遇到第一个空字符’\0’才停止计数。
  • 如果字符串没有终止的空字符,行为未定义。

15. strnlen

原型:

size_t strnlen(const char* str, size_t maxlen);

功能:

strnlen函数计算字符串str的长度,最多检查maxlen个字节,返回实际的长度,不包括终止的空字符’\0’。

注意事项:

  • 如果在maxlen字节内找不到空字符’\0’,返回maxlen。
  • 这是一个安全的版本,避免了潜在的缓冲区溢出。

16. memcmp

原型:

int memcmp(const void* ptr1, const void* ptr2, size_t n);

功能:

memcmp函数比较两个内存区域ptr1和ptr2的前n个字节。

  • 返回值小于0表示ptr1小于ptr2
  • 返回值等于0表示ptr1等于ptr2
  • 返回值大于0表示ptr1大于ptr2

注意事项:

  • 比较的是字节的数值,不考虑数据类型。
  • 适用于二进制数据的比较。

17. memchr

原型:

void* memchr(const void* ptr, int value, size_t n);

功能:

memchr函数在ptr所指向的内存区域的前n个字节中查找第一个等于value的字节,并返回指向该字节的指针。如果未找到,返回NULL。

注意事项:

  • value被转换为unsigned char进行比较。
  • 适用于二进制数据的搜索。

18. strerror

原型:

char* strerror(int errnum);

功能:

strerror函数返回一个指向描述错误号errnum的字符串的指针。

注意事项:

  • 错误消息是线程安全的,每次调用都会返回一个新的字符串。
  • 在多线程环境中,确保每次调用都获取最新的错误消息。

19. strcoll

原型:

int strcoll(const char* str1, const char* str2);

功能:

strcoll函数根据当前区域设置的字符集 collating sequence 比较两个字符串。

  • 返回值小于0表示str1小于str2
  • 返回值等于0表示str1等于str2
  • 返回值大于0表示str1大于str2

注意事项:

  • 考虑到本地化的字符集,比strcmp更合适用于排序和比较。

20. strxfrm

原型:

size_t strxfrm(char* dest, const char* src, size_t n);

功能:

strxfrm函数转换src字符串,使其适合使用strcmp进行比较,根据当前区域设置的字符集 collating sequence。

注意事项:

  • dest必须有足够的空间来存储转换后的字符串,至少n个字节。
  • 返回值是转换后字符串的长度,如果不超过n-1,则在dest中添加空字符’\0’。

好的,这次的内容就到这里啦

感谢你的阅读,欢迎点赞关注转发

我们,下次再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值