前言
今天小编给大家带来的是常用的字符串函数和内存函数的介绍以及它们中的部分函数的模拟实现,希望大家跟着小编的步伐,对这些函数的用法和逻辑有个大概的理解。
1.strlen函数
strlen函数的作用是得到字符串的长度.
size_t strlen ( const char *str );这里给出strlen函数的返回值和形式参数。以下有几点是大家需要注意的
1.字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )
2.参数指向的字符串必须要以 '\0'结束
3.函数的返回值为size_t,是无符号的(因为长度是不会出现负数的,所以我们这里使用无符号数)
使用演示:
#include<stdio.h> #include<string>//使用strlen函数前要包含该头文件 int main() { char arr[]="abcdefg"; int ret=strlen(arr); printf("%d",ret); return 0; }
代码结果:7
函数模拟实现:
对于strlen函数这里有三种模拟方法这里给大家介绍两种(还有一种我们放在指针的介绍中给大家说明)
#include<stdio.h> #include<assert.h> //strlen函数的模拟实现 //法一: size_t my_strlen1(const char* str) { assert(str != NULL); size_t count = 0; while (*str != '\0') { count++; str++; } return count; } //法二:递归 size_t my_strlen2(const char* str) { assert(str != NULL); if (*str != '\0') { return 1 + my_strlen2(str + 1); } else return 0; } int main() { char arr[] = "abcdefghi"; int ret = my_strlen1(arr); int ret1= my_strlen2(arr); printf("%d %d ", ret,ret1); return 0; }
结果如下:
2.strcpy
strcpy函数的作用是将源字符串复制到目标字符串的作用,下面给出该返回值和形式参数
char* strcpy(char * destination, const char * source );
这里source表示的是源字符串,destination表示的是目标字符串,该返回值返回的是目标字符串的地址来让我们使用。以下这里还有几点我需要说明
1.源字符串必须以 '\0' 结束。
2.会将源字符串中的 '\0' 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可变。(常量字符串不可修改)
对于第四点相信大家可能不是很理解,这里我用代码给大家解释一下
这里代码发生了错误,该原因就是由于常量字符串是不可修改的,所以该不能作为目标空间。
但是如果该字符作为源字符串,这里就是可以使用的,演示如下
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h>//使用strcpy函数前要包含该头文件 int main() { char arr[20] = { 0 }; char* p = "abcdefg"; printf("%s ",strcpy(arr, p)); return 0; }
结果:
函数模拟实现:
#include<stdio.h> #include<assert.h> //strcpy函数的模拟实现 char* my_strcpy(char* dest, const char* src) { assert(dest && src); char* ret = dest; while (*dest++ = *src++)//这里的是先进行解引用然后再进行指针后移,当*dest==*src=='\0'后结束 { ; } return ret; } int main() { char arr1[20] = "xxxxxxxxxxxx"; char arr2[] = "hello world"; printf("%s ", my_strcpy(arr1, arr2)); return 0; }
代码结果如下:
3.strcat
strcat函数的作用是实现字符串的追加,该返回值和形式参数如下
char * strcat ( char * destination, const char * source );
该是将source表示的源字符串追加到destination的目标字符串中,返回的是目标字符串的地址
注意:
1.源字符串必须以 '\0' 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。
4.目标空间必须有\0
使用如下:
#include<stdio.h> #include<string.h>//使用strcat函数前要包含该头文件 int main() { char arr[20] = "abc"; char arr1[20]= "abcdefg"; printf("%s ",strcat(arr, arr1)); return 0; }
结果展示:
模拟函数:
#include<stdio.h> #include<assert.h> //strcat函数的模拟实现 char* my_strcat(char* dest, char* src) { assert(dest && src); char* ret = dest; while (*dest != '\0') { dest++; } while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[20] = "hello"; char arr2[] = " world"; printf("%s", my_strcat(arr1, arr2)); return 0; }
结果如下:
4.strcmp
strcmp函数的作用是进行字符串的比较,该返回值和形参如下
int strcmp ( const char * str1 , const char * str2 );
标准规定:
1.第一个字符串大于第二个字符串,则返回大于0的数字
2.第一个字符串等于第二个字符串,则返回0
3.第一个字符串小于第二个字符串,则返回小于0的数字
另外对于strcmp函数的使用字符串的比较方式是比较对应位置的ASCLL码值。
使用方式如下
#include<stdio.h> #include<string.h>//使用strcmp函数前要包含该头文件 int main() { char arr[20] = "abc"; char arr1[20]= "abcdefg"; printf("%d",strcmp(arr, arr1)); return 0; }
结果如下:
模拟实现:
#include<stdio.h> #include<assert.h> int my_strcmp(const char* str1, const char* str2) { assert(str1 && str2); while (*str1 == str2) { if (*str1 == 0) { return 0; } str1++; str2++; } if (*str1 > *str2) { return 1; } else return -1; } int main() { char arr1[] = "abbc"; char arr2[] = "accs"; int ret = my_strcmp(arr1, arr2); printf("%d", ret); return 0; }
结果如下:
以上strcpy,strcat,strcmp这三种是长度不受限度的字符串函数,即一直会\0停止,这就导致这三种字符串函数不安全(有着非法访问的风险),这就导致C语言引入了长度受限制的字符串函数strncpy,strncat,strncmp。(由于该三个函数的用法和模拟思路和以上大同小异,这里我们就不进行使用和模拟,大家可以自己进行尝试)
5.strncpy
strncpy函数和strcpy函数的区别是strncpy可以指定源字符串复制到目标字符串的元素个数,
该返回值和形参如下:
char * strncpy ( char * destination, const char * source, size_t num );
num表示的是从source中指定拷贝几个元素
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加\0,直到num个该函数在拷贝过程中,如果source中拷贝的个数少于source的大小,当数据拷贝到destination中后,后面不会自动添加/0
6.,strncat
char * strncat ( char * destination, const char * source, size_t num );
num表示的是从source中指定追加几个字符,在追加后该会自动给字符串destination添加\0
7.strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
num表示的是指定比较几个字符,该返回值的规定和strcmp的规定一致