目录
1、strlen函数。
strlen函数是一个库函数,功能是计算字符串的长度。
size_t strlen(const char* string);
函数的参数是字符型指针,返回值是size_t类型,也就是无符号整型。
strlen是以字符'\0'作为结束标志,返回的值是'\0'前面的字符个数。
模拟实现函数strlen。
1、正常实现。
当数组元素的首地址传到my_strlen 函数中,my_strlen函数需要通过该地址向后找到字符'\0'并统计'\0'之前的元素个数(不包括\0)。
int my_strlen(const char* str)
{
assert(str!=NULL);
int count=0;
while(*str!='\0')
{
str++;
count++;
}
return count;
}
2、指针相减
指针减去指针得到的结果是两个地址之间的元素个数。
int my_strlen(const char* str)
{
assert(str!=NULL);
char* ret=str; //记着元素的首地址
while(*str!='\0')
{
str++;
}
return str-ret;
}
3、递归
int my_strlen(const char* str)
{
assert(str!=NULL);
if(*str!='\0')
return 1+ my_strlen(str+1);
else
return 0;
}
为了增加函数的鲁棒性,还需要断言指针,排除空指针的可能。
2、strcpy函数。
功能是将字符串2拷贝到字符串1中。
char * strcpy(const char* strDestination,const char*strSource);
源字符串必须以'\0'结束,该函数会将源字符串中的\0拷贝到目标字符串中。
该函数使用时,要确保目标字符串足够大,确保字符串可以完整拷贝。
目标字符串是可以被改变的,常量字符串是不能被改变的。
函数的返回值是目标字符串的首地址。
模拟实现strcpy.
char* my_strcpy(char* dest,const char* src)
{
assert(dest&&src);
char* ret=dest;
while(*dest++=*src++)
{
;
}
return ret;
}
3、strcmp函数
字符串比较函数。功能:比较字符串的大小,但比较的不是字符串的长短。
strcmp函数比较的不是字符串的长度,而是比较字符串中对应位置上字符的大小,如果相同,就比较下一对,直到不同或者都遇到\0.
是按字符的ASCII码值比较的。
函数有三个返回值,若两个字符串相等,则返回0;若字符串1>字符串2,则返回一个大于零的数,若字符串1<字符串2,则返回一个小于零的数。返回的数有不确定性,如果在VS2019环境下,返回的是1 0 -1 ,在其他环境则不确定。
模拟实现strcmp函数
int my_strcmp(const char* str1,const char* str2)
{
assert(str1&&str2);
while(*str1==*str2)
{
str1++;
str2++;
}
if(*str1=='\0')
return 0;
else
return *str1-*str2;
}
4、strcat函数
字符串追加函数。从目标函数的'\0'处开始,向后追加字符串2,直到字符串的\0位置处。
使用时要确保字符串1空间足够大,能够放下字符串2.
函数的返回值是字符串1的首地址
模拟实现strcat
char* my_strcat(char* str1,const char* str2)
{
assert(str1&&str2);
char* ret=str1;
while(*str1) //先找目标字符串的\0地址
{
str1++;
}
while(*str1++=*str2++)
{
;
}
return ret;
}
5、strstr函数
char *strstr( const char *string, const char *strCharSet );
找字符串中的子字符串。
返回值是子字符串的地址。
模拟实现strstr函数。
char *strstr( const char *str1, const char *str2 )
{
char* s1=str1;
char* s2=str2;
char* cur=str1;
while(*cur) //走到str1的最后
{
s1=cur;
s2=str2;
while(*s1&&*s2&&(*s1==*s2))
{
s1++;
s2++;
}
if(*s2==0)
return (char*)cur;
cur++;
}
return NULL;
}
6、strtok函数
字符串切割函数。
char* strtok(char* str,const char* sep);
sep是定义字符串分割符的集合 。
用法如下:
int main()
{
char arr[] = "zhangbq@qq.com";
char buf[30] = { 0 };
strcpy(buf, arr);//保留arr的数据
const char* sep = "@.";
char* str = NULL;
for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep)) // 妙
{
printf("%s\n", str);
}
//printf("%s\n",strtok(buf, sep));//只找第一个标记 @ zhangbq
//printf("%s\n", strtok(NULL, sep));//从保存好的位置开始继续往后找 . qq
//strtok(NULL, sep);//从保存好的位置开始继续往后找 \0 com
return 0;
}
7、strerror
返回错误码所对应的错误信息。
char* strerror(int errnum)
errno 全局变量错误码
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%s\n", strerror(i));
}
/*int *p=(int*)malloc(40); //向堆区申请内存的,返回申请空间的起始地址
if (p == NULL)
{
///printf("%s\n", strerror(errno));
perror("malloc");//自己会打印
return 1;
}*/
return 0;
}
错误码0-9对应的错误信息