一、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()函数;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
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);