字符串函数
求字符串函数(strlen)
头文件:string.h
字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')
注意函数的返回值为size_t,是无符号的
学会strlen函数的模拟实现:
1.创建临时变量
int make_strlen(char* str)
{
int a = 0;
while (*str != '\0')
{
a++;
str++;
}
return a;
}
int main()
{
char arr[] = "abc";
int len = make_strlen(arr);
printf("%d", len);
return 0;
}
2.递归(不创建临时变量)
int make_strlen(char* str)
{
if (*str != '\0')
{
return 1 + make_strlen(str + 1);
}
return 0;
}
int main()
{
char arr[] = "abc";
int len = make_strlen(arr);
printf("%d", len);
return 0;
}
拷贝字符串strcpy
头文件:string.h
strcpy(目标数组,源数组):把源字符串里面的东西拷贝到目标数组里面
不能这样写:char arr1[20]=arr2,这样无法将arr2中的字符转移
源字符串必须以\0结束,会将源字符串中的\0拷贝到目标空间,目标空间必须足够大,目标空间必须可变
模拟实现strcpy
char* make_strcpy(char* str1, char* str2)
{
char* a = str1;
while (*str1++ = *str2++)
//\0为假。当str2的\0赋给str1后,while判定为假跳出
{
;
}
}
int main()
{
char arr[] = "abc";
char crr[] = "def";
make_strcpy(arr, crr);
printf("%s", arr);
return 0;
}
追加字符串strcat
strcat(arr1,arr2)把源字符串追加在目标字符串后面,覆盖目标字符串的第一个\0
源字符串必须足够大,能容纳下源字符串的内容,目标空间必须可修改
strcat不能自己给自己追加,而strncat可以
模拟实现
void make_strcat(char* str1, char* str2)
{
while (*str1)
{
str1++;
}
while (*str2)
{
*str1++ = *str2++;
}
*str1 = *str2;
}
int main()
{
char arr1[20] = "abcdefg";
char arr2[] = "123";
make_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
字符串比较strcmp
strcmp(arr1 , arr2)
arr1和arr2一个一个字符来比,若arr1第一个不同的字符的ASCII码值大于arr2则返回一个大于0的数字,小于则返回一个小于0的数字,若完全相等则返回0。
模拟实现:
长度受限
长度受限字符串函数:strcpy,strcat,strcmp
长度不受限函数:strncpy,strncat,strncmp
strstr
strstr(arr1, arr2)在arr1中找arr2这个字符串,若找不到则返回空指针NULL,否则返回arr1中arr2的第一个字符的地址
strtok
strerror
返回错误码,所对应的错误信息
c语言的库函数在调用失败的时候,会将一个错误码存放在一个叫:errno的变量中,当我们想知道调用库函数的
时候发生了什么错位信息,就可以将:errno中的错误码翻译成信息
字符分类函数
内存函数
memcpy
memcpy(void* ptr1 , void* ptr2 , size_t num)
void*指针不能直接用,需强制转换成其他,num这里的单位是字节
和strcpy相似,但strcpy只能拷贝字符串,而memcpy可以拷贝任何
memmove
memmove(void* ptr1 , void* ptr2 , size_t num)
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
memcmp
memcmp(void* ptr1 , void* ptr2 , size_t num)
比较从ptr1和ptr2指针开始的num个字节
如图,此处arr1最后一个字节比arr2大,返回一个大于0的数字,反之返回一个小于0的数字,相等则返回0