1.四种函数的简介与功能实现
2.四种函数的用C语言实现
第一节 四种函数的简介与功能实现
概述:四种函数作为库函数均存在于头文件<string.h>中,在程序编写时,我们可以通过头文件,来对这四种库函数进行直接引用。
接下来,对以上这四种库函数的功能进行逐一介绍:
strlen函数:
功能:求字符串的长度,从内存的某个位置开始扫描,直到碰到第一个字符串结束符\0为止,然后返回"\0"之前的字符数。
说明:已知一个字符串时,想要直接获取该字符串的长度时,可以通过该函数进行获取。
功能实现:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[10] = "hello"; //也可以用指针定义:const char*arr = "hello"
int n = strlen(arr);
printf("%d", n);
return 0;
}
strcmp函数
功能:比较两个字符串的ACSII码值
说明:若两个字符的ACSII码值相等,则继续比较,(遇到'\0',比较结束)若不相等,则通过返回值来判断两个字符串的关系。(一般情况下,返回值有 1, -1,0三种情况)
返回值:
(1)若差值 = 0,则结束比较,说明两个字符串相等;
(2)若差值 > 0,则说明:字符串1>字符串2;
(3)若差值 < 0, 则说明: 字符串1<字符串2。
功能实现:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[10] = "hello"; //用指针:const char* arr = "hello";
char brr[10] = "hella"; //用指针:const char* brr = "hella";
int n = strcmp(arr, brr);
printf("%d", n);
return 0;
}
strcat函数
功能:将两个字符串进行链接
说明:字符串1存储于数组1中,字符串2存储于数组2中,将字符串2拼接在字符串1后面,使其变为一个新的字符串。
功能实现:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[100] = "hello"; //此处不可写为:const char* arr = "hello";
char brr[100] = "world"; //此处可以写为:const char* brr = "world";
strcat(arr, brr);
printf("%s", arr);
return 0;
}
strcpy函数
功能:将已知的一个字符串进行复制
说明:字符串1存储于数组1中,数组2为一个空数组,通过该函数可以将数组1中的字符串复制进入数组2中。
功能实现:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[100] = "hello world"; //此处可以写为:const char* arr
char brr[100] = {0}; //此处不可以写为:const char* brr
strcpy(brr,arr);
printf("%s", brr);
return 0;
}
第二节 四种函数的用C语言实现
概述:在平常解决问题中,我们可以直接引用头文件#include <string.h>来直接引用这四种函数,但是如果不让使用库函数来解决问题,那我们也可以根据库函数的功能用C语言的普通语句将其实现出来,同时也可以练习并提高自己的编写代码能力。
接下里,将给大家介绍以上四种函数用C语言基本语句的实现
每个函数,将分别用数组和指针分别给大家进行演示:
strlen函数
指针实现
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* arr)
{
assert(arr!=NULL);
int cnt = 0;
while (*arr)
{
cnt++;
arr++;
}
return cnt;
}
int main()
{
const char* arr = "hello";
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
数组实现
#include <stdio.h>
#include <assert.h>
int my_strlen(char arr[100])
{
assert(arr!=NULL);
int i = 0, len = 0;
while (arr[i] != 0)
{
len++;
i++;
}
return len;
}
int main()
{
char arr[100] = { "hello"};
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
以上两种方法都是递归算法,在数据结构中,我们会了解到一种递归算法,这种算法既有优点,也有缺点;
优点:代码更简洁清晰,可读性更好;
缺点:时间和空间消耗比较大。
先大概了解这么多,以后为单独为大家讲解,下面是strlen函数递归算法的解法:
以字符串“hello”,为例:
我们想要知道一个字符串的长度,可以定义一个指针,通过指针的移动来进行计数,而计数结束的标准则是当指针遇到字符'\0'时,则停止,此时,指针在不断靠近'\0'的过程中,则要不断地调用my_strlen函数,则不断调用该函数的思想过程成为递归思想。
当指针在遇到'\0'前会不断地自增,同时也会不断地调用自身函数,让指针进行进一步自增同时也会返回一个“+1”的值,等遇见'\0'时,返回0值,将0值作为最后一次调用my_strlen函数的函数值返回给上一个1 + my_strlen(arr),再将这次的结果作为返回值进行进一步的返回,以此类推,最终将最后的函数返回给main()函数。
代码如下:
#include <stdio.h>
int my_strlen(const char* arr)
{
if (*arr)
{
arr++;
return 1 + my_strlen(arr);
}
return 0;
}
int main()
{
const char* arr = "hello";
int result = my_strlen(arr);
printf("%d", result);
return 0;
}
说完递归与非递归,还有第三种方法等着大家哦:
指针相减法:
首先来说一下,什么是指针相减法
如果两个指针指向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目,如果两个指针不是指向同一个数组,它们相减就没有意义了。
#include <stdio.h>
int my_strlen(const char* arr)
{
const char* p = arr;
while (*arr)
{
arr++;
}
return arr - p;
}
int main()
{
const char* arr = "hello";
int result = my_strlen(arr);
printf("%d", result);
return 0;
strcmp函数
指针实现
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* arr, const char* brr)
{
assert(arr != NULL && brr != NULL);
while (*arr == *brr)
{
if (*arr == '\0') //hell
return 0; //hello
arr++;
brr++;
}
int result = *arr - *brr;
if (result > 0)
return 1;
else if (result < 0)
return -1;
else
return 0;
}
int main()
{
const char* arr = "hell";
const char* brr = "hello";
int result = my_strcmp(arr, brr);
printf("%d", result);
return 0;
}
数组实现
#include <stdio.h>
#include <assert.h>
int my_strcmp(char arr[], char brr[])
{
assert(arr != NULL && brr != NULL);
int i = 0, j = 0;
while (arr[i] == brr[j])
{
if (arr[i] == '\0')
return 0;
i++;
j++;
}
int result = arr[i] - brr[j];
if (result > 0)
return 1;
else if (result < 0)
return -1;
else
return 0;
}
int main()
{
char arr[100] = "hell";
char brr[100] = "hello";
int result = my_strcmp(arr, brr);
printf("%d", result);
return 0;
}
strcat函数
指针实现
注:此处指针实现strcat函数,使用了三种方法,在代码中已经标明:/*(1) */为第一种,/*(2)*/为第二种,正在使用的是第三种。
第一种与第三种的原理类似,都是通过遍历完字符串arr后在arr后将brr的字符串加进去,第二种通过计算arr长度后,通过解引用的方式,给字符串arr后直接赋予字符串brr的内容。
#include <stdio.h>
#include <assert.h>
#include <string.h> //为了计算len_arr而使用,也可也不使用
void my_strcat(char* arr, char* brr)
{
assert(arr != NULL && brr != NULL);
int len_arr = strlen(arr);
/*(1)
while (*arr)
{
arr++;
}
while (*brr)
{
*arr++ = *brr++;
}*/
/*(2)
int i = 0;
while (*(brr + i))
{
*(arr + len_arr + i) = *(brr + i);
i++;
}*/
while (len_arr>0)
{
arr++;
len_arr--;
}
while (*brr)
{
*arr++ = *brr++;
}
}
int main()
{
char arr[100] = "hello";
const char* brr = "world";
my_strcat(arr, brr);
printf("%s", arr);
return 0;
}
数组实现
#include <stdio.h>
#include <assert.h>
#include <string.h>
void my_strcat(char arr[],char brr[])
{
int i = 0, j = 0;
assert(arr != NULL && brr != NULL);
int len_arr = strlen(arr);
/*(1)while (arr[i])
{
i++;
}
while (brr[j])
{
arr[i] = brr[j];
i++;
j++;
}*/
/*(2)while (brr[j])
{
arr[len_arr + i] = brr[j];
i++;
j++;
}*/
while (len_arr > 0)
{
i++;
len_arr--;
}
while(brr[j])
arr[i++] = brr[j++];
}
int main()
{
char arr[100] = "hello";
char brr[100] = "world";
my_strcat(arr, brr);
printf("%s", arr);
return 0;
}
以上数组实现也为三种方法。
strcpy函数
指针实现
注:/* */注释中的内容为my_strcpy的另一种方法,第一种方法是用while()循环,第二种方法是用for()循环。
#include <stdio.h>
#include <assert.h>
void my_strcpy( char* arr, char* brr)
{
assert(arr != NULL && brr != NULL);
while(*arr)
{
*brr++ = *arr++ ;
}
*brr= '\0' ;
}
/*for (int i = 0; *(arr + i) != '\0'; i++)
{
*brr++ = *(arr + i);
}
*brr = '\0';*/
}
int main()
{
char arr[100] = "hello";
char brr[100];
my_strcpy(arr, brr);
printf("% s", brr);
return 0;
}
数组实现
#include <stdio.h>
#include <assert.h>
void my_strcpy(char brr[],char arr[])
{
assert(arr != NULL && brr != NULL);
/*int i = 0, j = 0;
while (arr[i])
{
brr[j++] = arr[i++];
}*/
int j = 0;
for (int i = 0; arr[i]!= '\0'; i++)
{
brr[j++] = arr[i];
}
}
int main()
{
char arr[100] = "hello";
char brr[100] = { 0 };
my_strcpy(brr, arr);
printf("%s", brr);
return 0;
}
数组实现用了两种方法,注释内部为第一种方法,注释外部是第二种方法。