c语言——字符函数与字符串函数-二 字符串函数

(1)strlen函数的使用与模拟

strlen函数用于获取字符串的长度,不包括末尾的’\0’.
在这里插入图片描述

#include<stdio.h>
#include<string.h>
int main() {
	char arr [] = "abcdefghi";
	size_t len = strlen(arr);
	printf("%zd\n", len);
	return 0;
}

在这里插入图片描述
模拟:
三种实现方式:计数器,递归,指针-指针。

size_t my_strlen1(const char* arr) {
     //用计数器的方式
	char* cur = arr;
	size_t size = 0;
	while (*cur != '\0') {
		size++;
		cur++;
	}
	return size;
}
size_t my_strlen2(const char* arr) {
    //采用递归的方式
	if (*arr == '\0') {
		return 0;
	}

	return 1 + my_strlen2(arr + 1);

}
size_t my_strlen3(const char* arr) {
	//采用指针减指针的方式
	char* cur = arr;
	while (*cur != '\0') {
		cur++;
	}
	return cur - arr;

}
int main() {
	/*char arr [] = "abcdefghi";
	size_t len = strlen(arr);
	printf("%zd\n", len);*/

	//对于strlen函数的模拟实现:
	//三种方式:
	char arr[] = "abcdefghi";
	size_t len = my_strlen1(arr);
	printf("%zd\n", len);
	len = my_strlen2(arr);
	printf("%zd\n", len);
	len = my_strlen3(arr);
	printf("%zd\n", len);
	return 0;
}

(2)strcpy函数的使用与模拟

strcpy函数用于拷贝字符串到另外一个数组中去!
拷贝时将字符串末尾的’\0’也拷贝过去!
在这里插入图片描述
使用:

int main() {
	char arr[] = "abcedfhrj";
	char arr1[20] = "xxxxxxxxxxxxxxxxxxx";

	strcpy(arr1, arr);
	printf("%s\n", arr1);
	}

在这里插入图片描述
在这里插入图片描述
模拟:

#include<stdio.h>
char* my_strcpy(char *dest,const char * src) {
	char* cur1 = src;
	char* cur2 = dest;


	while (*dest++ = *cur1++) {
		;
	}
	return cur2;
}
int main() {
	char arr[] = "abcedfhrj";
	char arr1[20] = "xxxxxxxxxxxxxxxxxxx";

	/*strcpy(arr1, arr);
	printf("%s\n", arr1);*/
	//对于strcpy函数的模拟实现:
	my_strcpy(arr1, arr);
	printf("%s\n", arr1);
	return 0;
}

在这里插入图片描述

(3)strcmp函数的使用与模拟

本函数用于比较两个字符串的大小

比较的规则是从左往右比较对应的字符,如果对应的字符大,则说明字符串大,返回大于0的数字反之则小,
返回小于0的数字,如果相等返回0,在VS中,返回的数字是1,-1,0。

在这里插入图片描述

使用:

#include<stdio.h>
int main() {
	//本函数用于比较字符串:、
	char arr1[] = "hello";
	char arr2[] = "hellob";
	int ret = strcmp(arr1, arr2);
	printf("%d\n", ret);  //如果左边字符串小,则返回小于0的数
	                      //如果左边字符串大,则返回大于0的数
	                     //如果相等,则返回0.
	//模拟实现
	/*int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);*/
	return 0;
}

在这里插入图片描述
模拟:

int my_strcmp(const char* arr1,const char* arr2) {
      //开始比较:
	//如果两个字符串前面的字符相等,则往后遍历,
	while (*arr1 == *arr2) {
		//当字符串比较到两个'\0'相等时。
		if (*arr1 == '\0') {
			return 0;
		}

		   arr1++;
		   arr2++;
	  }
    
	//找到不同的字符后
	return *arr1 - *arr2;
}
int main() {
	//本函数用于比较字符串:、
	char arr1[] = "hello";
	char arr2[] = "hellob";
	/*int ret = strcmp(arr1, arr2);
	printf("%d\n", ret); */ //如果左边字符串小,则返回小于0的数
	                      //如果左边字符串大,则返回大于0的数
	                     //如果相等,则返回0.
	//模拟实现
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述

(4)strcat 函数的使用与模拟

strcat函数的作用是在字符串后面添加字符串!

#include<stdio.h>
int main() {
	char* arr1 = "hello";
	char arr2[20] = "world";
	strcat(arr2, arr1);
	//对于strcat函数进行模拟实现
	//my_strcat(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

在这里插入图片描述
模拟:

void  my_strcat(char* dest, const char* src) {
	//在第一个字符串的末尾找到\0,然后开始添加字符
	char* ret = dest;
	
	while (*dest!= '\0') { //这里有问题!
		//如果判断条件写成*dest++!='\0',则当*dest ='\0'时,dest依然会++!
		dest++;
	}
	//拷贝
	while (*dest++ = *src++) {
		;
	}
}

int main() {
	char* arr1 = "hello";
	char arr2[20] = "world";
	//strcat(arr2, arr1);
	//对于strcat函数进行模拟实现
	my_strcat(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

在这里插入图片描述

两组函数的区别:

在这里插入图片描述

(5)strncpy函数

在这里插入图片描述

//strncpy函数设定了函数复制字符串中字符的个数
int main() {
	char arr1[20] = "xxxxxxxxxxxx";
	char arr2[] = "world";
   	strncpy(arr1, arr2, 3);
	printf("%s\n", arr1);
 
	return 0;
}

在这里插入图片描述

如果指定的个数大于字符串的个数呢?
int main() {
	char arr1[20] = "xxxxxxxxxxxx";
	char arr2[] = "world";
	strncpy(arr1, arr2, 8); 
	printf("%s\n", arr1);
 
	return 0;
}

在这里插入图片描述

//调试结果表明:当指定的个数大于字符串的个数时,函数会用'\0'补充!

(6)strncmp函数的使用

int main() {
	//本函数比较指定的数量的字符
	char arr1[] = "hello world";
	char arr2[] = "hello";
	//只比较前四个字符的结果:
	int len = strncmp(arr1, arr2, 4);
	printf("%d\n", len);
	return 0;
}

在这里插入图片描述

(7)strncat函数的使用

int main() {
	char arr1[20] = "hello ";
	char arr2[] = "world";
	//添加指定个数的字符到字符串中:
	 strncat(arr1, arr2, 3);
	 printf("%s\n", arr1);
	return 0;
}

在这里插入图片描述

 //如果指定的字符个数大于所在的字符串中的字符个数?
int main() {
	char arr1[20] = "hello ";
	char arr2[] = "world";
	
	 strncat(arr1, arr2, 8);
	 printf("%s\n", arr1);  
	return 0;
}

在这里插入图片描述

//则会添加字符串中的所有字符,不包括\0。

(8)strstr函数的使用与模拟

本函数的功能用于查找在字符串中另一个字符串
int main() {
	//本函数的功能用于查找在字符串中另一个字符串
	char arr1[] = "hello world";
	char arr2[] = "llo";
	//返回要查找的字符串的位置
	char* cur = strstr(arr1, arr2);
	printf("%s\n", cur);
	return 0;
}

在这里插入图片描述
模拟:
在这里插入图片描述

char* my_strstr(const char * arr1, const char *arr2) {
	char* cur1 = arr1;   //用于遍历被查找的字符串的指针
	char* cur2 = arr2;   //用于遍历查找的字符串的指针
	char* cur11 = arr1;  //用于保存被查找字符串 开始查找位置的指针

	//遍历第一个字符串
	while (*cur11!='\0') {

		//如果当前字符匹配,则继续往下寻找
	   //*cur2不能够等于'\0'
		while (*cur1 == *cur2 && *cur2!='\0' && *cur1!='\0') {
			cur1++;
			cur2++;
		}
		//当循环停止或没有进入循环时,有以下几种情况:
		//1. 未进入循环或进入循环后,遇到不匹配的字符退出循环
		if (*cur1 != '\0' && *cur2 != '\0') {
			//此时将cur2指针回归到原来的位置:
			cur2 = arr2;
			//将cur1指针回到原来的位置后,向后移动一个字符
			cur1 = cur1 + 1;
		}
		// 2.当*cur2等于'\0'时,*cur1等于'\0'或不等于'\0'
		if (*cur2 == '\0') {
			//此时返回cur11中的值
			return cur11;

		}
		// 3. 当*cur1等于'\0',并且*cur2不等于'\0'时:
		if (*cur1 == '\0' && *cur2 != '\0') {
			return NULL;
		}
		cur11++;
	}
	return NULL;


}
int main() {
	//本函数的功能用于查找在字符串中另一个字符串
	char arr1[] = "hello world";
	char arr2[] = "llo";
	//返回要查找的字符串的位置
	//char* cur = strstr(arr1, arr2);
    //对于本函数的模拟实现
	char* cur = my_strstr(arr1, arr2);
	printf("%s\n", cur);
	return 0;
}

在这里插入图片描述

(9)strtok函数的使用

 此函数用于将界符设置成\0,并返回界符分割的字符串的首地址
每调用一次本函数,则将字符串按界符切一次,将一个界符置为'\0',返回被切后的字符 
串的首地址。

在这里插入图片描述

函数需要的参数有被切的字符串与界符组成的字符串

如果一个字符串有多个界符,需要被多次切割,第一次调用函数时,第一个参数需要是指定的字符串地址,而往后调用函数,第一个参数传入NULL即可,(在切割后,函数中会自动报存切割后的信息)。

 当字符串切割完毕时,再调用本函数则返回的值为NULL。

举例:

int main() {
	//本函数用于获得界符分开的字符串的指针
	char arr1[25] = "zezhangyong@name.age"; 
	char *  arr2 = ".@";

	char* ret = strtok(arr1, arr2);
	printf("%s\n", ret);
	ret = strtok(NULL, arr2);
	printf("%s\n", ret);
	ret = strtok(NULL, arr2);
	printf("%s\n", ret);
	ret = strtok(NULL, arr2);
	printf("%s\n", ret);

	return 0;
}

在这里插入图片描述
设置成循环:

int main() {
	//本函数用于获得界符分开的字符串的指针
	char arr1[25] = "zezhangyong@name.age"; 
	char *  arr2 = ".@";
	char* ret = NULL;
	
for (ret = strtok(arr1, arr2);ret !=NULL ; ret = strtok(NULL,arr2) ) 
{
	                  printf("%s\n", ret);
}
	return 0;
}

在这里插入图片描述

(10)strerror函数的使用

在c语言中,当我们使用c语言提供的库函数时,发生某种错误,就会对应相应的错误码,错误码是c语言标准库和不同系统中实现规定的。
在c语言中错误码实现在errno.h文件中:

在这里插入图片描述

不同的错误码对应着不同的错误信息,strerror函数正是用来获取错误信息的指针。
在这里插入图片描述
本函数的参数是错误码,在c语言程序启动时,便会设置一个errno全局变量记录当前程序的错误码。

//当前文件夹中并没有test.txt文件,现在执行打开文件,会返回NULL值!
int main() {
//打开文件
FILE * p1 = fopen("test.txt", "r");
if (p1 == NULL) {
	//errno中的数字对应不同的错误信息。
	printf("%s\n", strerror(errno));
	}
	return 0;
}

在这里插入图片描述
结果表明:没有当前文件或文件夹!

perror函数

上面的strerror函数只能够获取错误信息指针,而没有打印功能,
而perror函数可以看做是printf函数与strerror函数的封装,即可以获取错误信息指针,又可以打印。

在这里插入图片描述
本函数的参数是错误信息提示,我们可以自己编写。

int main() {
FILE * p1 = fopen("test.txt", "r");
if (p1 == NULL) {
	//errno中的数字对应不同的错误信息。
	perror("文件错误"); 
	}
	return 0;
}

在这里插入图片描述

上一篇:使用Spring Boot设计一套BI系统


下一篇:流批一体计算引擎-10-[Flink]中的常用算子和DataStream转换