目录
一、求字符串长度:strlen
语法: size_t strlen(const char* str);
●strlen函数返回的是字符'\0'前面出现的字符个数
●参数指向的字符串必须要以'\0'结束
●函数的返回值为size_t,是无符号整型
//模拟实现strlen函数
int my_strlen(const char* str)
{
assert(str!=NULL);
while(*str!='\0')
{
count++;
str++;
}
return count;
}
二、长度不受限制的字符串函数
1、字符串复制函数strcpy
语法:char* strcpy(char* destination,const char* source);
●源字符串必须以'\0'结束
●目标空间必须足够大,以确保能存放字符串
●目标空间必须可变
2、字符串追加函数strcat
语法:char* strcat(char* destination,const char* source);
●源字符串必须以'\0'结束
●目标空间必须足够大,能容纳下源字符串的内容
●目标空间必须可修改
●无法自己追加自己,因为\0被覆盖了,永远无法结束。
//模拟实现strcat函数
char* my_strcat(char* dest,const char* src)
{
char* ret=dest;
assert(dest&&src);
//找到目标字符串的\0
while(*dest)
{
dest++;
}
//追加
while(*dest++=*src++;)
{
;
}
return ret;
}
3、字符串比较函数strcmp
语法:int strcmp(const char* str1,const char* str2);
●标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字;第一个字符串等于第二个字符串,则返回0;第一个字符串小于第二个字符串,则返回小于0的数字。
//1
int my_strcmp(const char* s1,const char* s2)
{
assert(s1&&s2);
while(*s1==*s2)
{
if(*s1=='\0')
{
return 0;
}
s1++;
s2++;
}
if(*s1>*s2)
{
return 1;
}
else
{
return -1;
}
}
//2
int my_strcmp(const char* s1,const char* s2)
{
assert(s1&&s2);
while(*s1==*s2)
{
if(*s1=='\0')
{
return 0;
}
s1++;
s2++;
}
return *s1-*s2;
}
三、长度受限制的字符函数
1、字符串复制函数strncpy
语法:char* strncpy(char* destination,const char* source,size_t num);
2、字符串追加函数strncat
语法:char* strncat(char* destination,const char* source,size_t num);
3、字符串比较函数strncmp
语法:char* strncmp(char* destination,const char* source,size_t num);
四、字符串查找
1、strstr
语法:char* strstr(const char* str1,const char* str2);
作用:在一个字符串中找另外一个字符串,返回第一次出现的位置或者null指针
int my_strstr(const char* str1,const char* str2)
{
assert(str1&&str2);
const char* s1=NULL;
const char* s2=NULL;
char* cp=str1;
if(*str2=='\0')
{
return (char*)str1;
}
while(*cp)
{
s1=cp;
s2=str2;
while(*s1 && *s2 && (*s1==*s2))
{
s1++;
s2++;
}
if(*s2=='\0')
{
return (char*)cp;
}
cp++;
}
return NULL;
}
2、strtok
语法:char* strtok(char* str,const char* sep);
作用:用来切割字符串
●sep参数是个字符串,定义了用作分隔符的字符集合
●第一个参数指定了一个字符串,它包含了0个或多个由sep字符串中一个或多个分隔符分割的标记
●strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针
●strtok函数会改变被操作的字符串,因此在使用strtok函数切分字符串一般都是临时拷贝的内容,并且可修改
●strtok函数中的第一个参数不为NULL时,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置;strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
●如果字符串中不存在更多的标记,则返回NULL指针
int main()
{
char arr[]="abc@qq.com";
char *p="@.";
char tmp[20]={0};
strcpy(tmp,arr);
char* ret=NULL;
for(ret=strtok(tmp,p);ret!=NULL;ret=strtok(NULL,p))
{
printf("%s\n",ret);
}
return 0;
}
五、错误信息报告:strerror
语法:char* strerror(int errnum);
作用:返回错误码,所对应的错误消息
要求:必须包含头文件#include<errno.h>
int main()
{
printf("%s\n",strerror(0)); //No error
printf("%s\n",strerror(1)); //Operation not permitted
printf("%s\n",strerror(2)); //No such file or directory
printf("%s\n",strerror(3)); //No such process
printf("%s\n",strerror(4)); //Interrupted function call
printf("%s\n",strerror(5)); //Input/output error
return 0;
}
六、字符操作函数
1、字符分类函数
函数 | 如果函数参数符合下列条件就返回真 |
iscntrl | 任何控制字符 |
isspace | 空白字符:空格''、换页符'\f'、换行'\n'、回车'\r'、制表符'\t'或垂直制表符'\v' |
isdigit | 十进制数字0-9 |
isxdigit | 十六进制数字,包括所有的十进制数字、小写字母a-f、大写字母A-F |
islower | 小写字母a-f |
isupper | 大写字母A-F |
isalpha | 字母a-z或A-Z |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgragh | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
2、字符转换函数
int tolower(int c);
int toupper(int c);
七、内存操作函数
1、memcpy
语法:void* memcpy(void* destination,const void* source,size_t num);
作用:可以拷贝不重叠的内存
//例
int main()
{
int arr1[10]={1,2,3,4,5,6,7,8,9,10};
int arr2[10]={0};
memcpy(arr2,arr1,20);//拷贝5个数
return 0;
}
//模拟实现memcpy函数
void* my_memcpy(void* dest,const void* src,int num)
{
assert(dest&&src);
while(num--)
{
*(char*)dest=*(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
}
return ret;
}
2、memmove
语法:void* memmove(void* destination,const void* source,size_t num)
作用:拷贝,可以处理内存重叠的情况
void* my_memmove(void* dest,const void* src,size_t num)
{
void* ret=dest;
assert(dest&&src);
if(dest<src)
{
while(num--)
{
*(char*)dest=*(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
}
}
else
{
while(num--)
{
*((char*)dest+num)=*((char*)src+num);
}
}
return ret;
}
3、memset
语法:void* memset(void* ptr,int value,size_t num)
作用:把ptr指向空间的前num个字节内容设置成value值
4、memcmp
内存比较函数
语法:int memcmp(const void* ptr1,const void* ptr2,size_t num),比较前num个字节