文章目录
1.strlen函数
1.1函数认识
size_t strlen ( const char * str );
strlen:计算字符串的长度。
字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束。
注意函数的返回值为size_t,是无符号的。
1.2函数的模拟实现
接下来让我们来模拟实现strlen函数。
size_t my_strlen(const char* str)
{
int ret = 0;
char* s = str;
while (*s)
{
ret++;
s++;
}
return ret;
}
1.3 strlen和sizeof的区别
sizeof函数也可以计算字符串长度,那为什么还会有strlen函数呢?
这是因为在计算字符串长度中sizeof和strlen是有一些不同的。
int main()
{
char a[] = "abcdef";
int ret1 = strlen(a);
int ret2 = sizeof(a);
printf("%d\n", ret1);
printf("%d\n", ret2);
return 0;
}
我们可以发现sizeof计算字符串长度比strlen多1。
这是因为字符串在存储时是以’\0’结尾的,sizeof在计算时会将字符’\0’也计算进去。
而strlen是遇到’\0’就停止计算,没有将’\0’计算进去。
2.strcpy函数
2.1函数认识
strcpy:将字符串拷贝到目的空间中。
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
2.2函数的模拟实现
下面是strcpy函数的模拟实现代码:
void my_strcpy(char* arr1, const char* arr2)
{
char* p = arr1;
while (*arr1++ = *arr2++)
{
;
}
}
3.strcat函数
3.1函数认识
strcat:将源字符串和目的空间的字符串拼接,并将拼接后的字符串放在目的空间中。
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
3.2函数的模拟实现
下面是strcat函数的模拟实现代码:
char* my_strcat(char* arr1, const char* arr2)
{
char* str1 = arr1;
char* str2 = arr2;
while (*str1)
{
str1++;
}
while (*str2)
{
*str1 = *str2;
str1++;
str2++;
}
return arr1;
}
4.strcmp函数
4.1函数认识
strcmp:字符串比较函数
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
那么字符是如何进行判断的呢?
其实字符在内存中是以ASCll码值存储的
字符串在比较时是先比较第一个字符的ASCll码值,如果相同就比较下一个字符,直到比较到不同字符或者字符结束。
4.2函数的模拟实现
下面是strcmp的模拟实现代码:
int my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
str1++;
str2++;
}
return *str1 - *str2;
}
5.strncpy函数
5.1函数认识
strncpy:拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
5.2函数的模拟实现
下面是strncpy的模拟实现代码:
char* my_strncpy(char* arr1, const char* arr2, int n)
{
char* str = arr1;
int i = 0;
for (i = 0; i < n; i++)
{
* (arr1 + i) = *(arr2 + i);
}
return str;
}
6.strncat函数
6.1函数认识
strncat:将源字符串中num个字符与目的空间中的字符串拼接,将拼接后的字符串放到目的空间中。
6.2函数的模拟实现
下面是strncat的模拟实现代码:
char* my_strncat(char* arr1, const char* arr2, int n)
{
char* ret = arr1;
while (*arr1)
{
arr1++;
}
int i = 0;
for (i = 0; i < n; i++)
{
*(arr1 + i) = *(arr2 + i);
}
return ret;
}
7.strncmp函数
7.1函数认识
strncmp:比较两个字符串中的前num个字符。
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
7.2函数的模拟实现
下面是strncmp的模拟实现代码:
int my_strncmp(const char* str1, const char* str2, int n)
{
while ((*str1 == *str2)&&(n))
{
str1++;
str2++;
n--;
}
return *str1 - *str2;
}
8.strstr函数
8.1函数认识
strstr:判断目的字符串中是否存在源字符串,若存在,返回目的字符串中源字符串的起始地址,不存在,则返回空指针。
8.2函数的模拟实现
下面是strstr的模拟实现代码:
char* mystrstr(const char* str1, const char* str2)
{
char* cp = str1;
char* s1 = cp;
char* s2 = str2;
if (*s2 == '\0')
return NULL;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cp;
cp++;
}
return NULL;
}
9.strtok函数
char * strtok ( char * str, const char * sep );
- sep参数是个字符串,定义了用作分隔符的字符集合。
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
- strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
10.strerror函数
strerror:返回错误码所对应的信息。
字符分类函数:
字符转换:
int tolower ( int c );
int toupper ( int c);
以上就是本篇文章所讲的内容,如果有什么问题请指出,我会进行改正!欢迎大家在评论区进行留言讨论!