1、strlen
? 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )。 size_t strlen ( const char * str );
参数指向的字符串必须要以 ‘\0’ 结束。 注意函数的返回值为size_t,是无符号的( 易错 )
strlen("abc")-strlen("abcdef")
实现 my_strlen
size_t my_strlen(char *str){
int ret=0;
while(*str!='\0'){
ret++;
str++;
}
return ret;
}
2、strcpy
- 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变
char* my_strcpy(char *str1,const char *str2){
char *ret=str1;
while(*str1++=*str2++){
;
}
return ret;
}
3、strcat
char * strcat( char * str1 , const char * str2 )
在 str1 后面追加 str2
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
- 不允许自己给自己追加 ,末尾的 ‘\0’ 被覆盖,会陷入死循环
char* my_strcat(char *str1,const char *str2){
assert(str1&&str2);
char *ret=str1;
while(*str1){
str1++;
}
while(*str1++=*str2++){
;
}
return ret;
}
4、 strcmp
标准规定: 第一个字符串大于第二个字符串,则返回大于0的数字 第一个字符串等于第二个字符串,则返回0 第一个字符串小于第二个字符串,则返回小于0的数字
大于和小于 是 对比不相等的那个字符的大小
int my_strcmp(const char *str1,const char *str2){
while(*str1==*str2){
if(*str1=='\0') return 0;
str1++;
str2++;
}
return (*str1-*str2);
}
长度受限制的字符串函数
strncpy
- 拷贝num个字符从源字符串到目标空间。
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
char* my_strncpy(char *str1,const char *str2,int n){
char*ret=str1;
for(int i=0;i<n;i++){
*(str1+i)=*(str2+i);
if(*(str1+i)=='\0') break;
}
return ret;
}
strncat
- 将 src 的前num个字符追加到目标,加上一个终止空字符。
- 如果 src 中C字符串的长度小于num,则只复制终止空字符之前的内容。
strncmp
- 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
int my_strncmp(const char *str1,const char *str2,int n){
while(*str1==*str2&&--n){
if(*str1=='\0') return 0;
str1++;
str2++;
}
return (*str1-*str2);
}
5、strstr
字符串查找字串
char* my_strstr(const char *str1,const char *str2){
const char *s1,*s2;
const char *p =str1;
while(*p){
s1=p;
s2=str2;
while(*s2 && !(*s1-*s2) ){
s1++;
s2++;
}
if(!*s2) return (char*)p;
p++;
}
return NULL;
}
6、strtok
char * strtok ( char * str, const char * sep );
sep参数是个字符串,定义了用作分隔符的字符集合 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。
? strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: ? strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。) ? strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。 ? strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。 ? 如果字符串中不存在更多的标记,则返回 NULL 指针。
用法:
char *p = "zhangpengwei@bitedu.tech";
const char* sep = ".@";
char arr[30];
char *str = NULL;
strcpy(arr, p);
for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep)){
printf("%s\n", str);
}
7、strerror
char * strerror ( int errnum );
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n",strerror(errno));
return 0;
}
字符分类函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOGUrUsg-1658208840319)(E:\Typora\比特C\比特C .assets\1658173686757.png)]
字符转换函数:
int tolower ( int c );
int toupper ( int c );
8、mencpy
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 ‘\0’ 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
void* my_memcpy(void *str1,const void *str2,size_t num){
assert(str1&&str2);
void *ret=str1;
while(num--){
*(char*)str1=*(char*)str2;
str1=(char*)str1+1;
str2=(char*)str2+1;
}
return ret;
}
9、memmove
void * memmove ( void * destination, const void * source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
void* my_memmove(void *dest,const void *src,size_t num){
assert(dest&&src);
void *ret=dest;
if(dest<=src){
while(num--){
*(char*)dest=*(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
}
}
else{
while(num--){
*( (char*)dest +(char)num )=*( (char*)src +(char)num );
}
}
return ret;
}
|