C语言之字符处理函数

一、C语言标准库中字符处理函数许包含头文件 <string.h>,常用字符串吹函数列表如下:

1 计算字符串长度

  • size_t strlen(const char *str); //不包含结束符'\0'

2 字符串拷贝

  • char *strcpy(char *dest, const char *src);
  • char *strncpy(char *dest, const char *src, size_t n); //复制n个字符,当n>strlen(src)时会填充多个'\0',当n<strlen(src)时dest没有结束符'\0'的
  • void *memcpy(void *dest, const void *src, size_t n);
  • void *memmove(void *dest, const void *src, size_t n); //支持dest和src内存区域重叠的场景

3 字符串比较

  • int strcmp(const char *str1, const char *str2);
  • int strncmp(const char *str1, const char *str2, sieze_t n); //最多比较前n个字符
  • void memcmp(const void *str1, const void *str2, size_t n);

4 追加:覆盖原dest的'\0'处,并自动添加新的结束符'\0'

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

5 查找字符

  • char *strchr(const char *str, int c); //从左到右遍历
  • char *strrchr(const char *str, int c); //从右到左遍历
  • void *memchr(const void *str, int c, size_t n);

6 查找字符串

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

7 分解字符串

  • char *strtok(char *str, const char *delim);
  • char *strtok_s(char *str, const char *delim, char **buf); //Windows安全
  • char *strtok_r(char *str, const char *delim, char **saveptr); //Linux安全

strtok函数第一次调用将str设置为待分割的字符串,往后的调用则将str设置为NULL;

strtok函数会破坏参数str的完整性,即调用前和调用后的str已经不一样了,第一次分割后的剩余字符串存储在内部的static变量中,因此多线程访问不安全

strtok_s和strtok_r函数虽然也会破坏参数str的完整性,但是它们将剩余的字符串存储在参数buf或saveptr中,所以是线程安全的;

_beginthreadex()和CreateThread()的区别

(1)_beginthreadex()函数在创建线程时第一步会分配并初始化一个_tiddata块,这个是用来存储线程私有的数据。然后第二步会调用CreateThread()函数,最后第三步会释放_tiddata块。新线程运行是首先将_tiddata块和自己关联起来,新线程如果调用标准C运行库(比如strtok)时把需要保护的数据存入_tiddata块中,这样每个线程都只会访问和修改自己的数据而不会影响其他线程,因此线程是安全的。

(2)对于CreateThread()函数如果新线程调用了需要_tiddata块的函数(比如strtok)时,C运行库会分配并初始化_tiddata块并和新线程关联但是最后不会释放_tidata块,造成内存泄露,除非显示调用_endthread()函数;

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     char s[] = "ab:cd:ef:gh:ij:kl:mn";
 7     char *delim = ":", *p = NULL;
 8 
 9     printf("s=%s\n", s); //s=ab:cd:ef:gh:ij:kl:mn
10     p = strtok(s, delim);
11     printf("p=%s, s=%s\n", p, s); //p=ab,s=ab
12     while((p = strtok(NULL, delim)) != NULL)
13     {
14         printf("p=%s, s=%s\n", p, s); //p=ed,p=ef,...,p=mn; s=ab
15     }
16     return 0;
17 }
View Code

8 复位字符串

  • void memset(void *str, int c, size_t n);

二、其他字符串相关函数

1 字符串转化为整数(#include <stdlib.h>)

  • int atoi(const char *str);
  • long int atol(const char *str);
  • double atof(const char *str);

转载于:https://www.cnblogs.com/bo1990/p/11381890.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值