首页 > 其他分享 >c语言——字符函数与字符串函数

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

时间:2024-06-10 16:33:14浏览次数:16  
标签:字符 函数 ret char arr2 arr1 printf 字符串

文章目录


一 字符函数

(1) 字符分类函数:

c语言字符有许多种,有数字字符,有字母字母,有可打印字符,有不可打印字符等等,为了判断字符是哪一种类,c语言提供了一系列的字符分类函数:

在这里插入图片描述
这些函数的参数是指定的字符,返回值为int类型,如果是字符是指定类型,则返回非0的数,否则返回0。

举例:

#include<ctype.h>  //字符函数包含在ctype.c函数中!
int main() {
	
	//如果是空格,则返回非0的值,如果不是空格则返回0
	int ret = isspace(' '); 
	printf("%d\n", ret);
	ret = isspace('a');
	printf("%d\n", ret);
	return 0 ;
	}

在这里插入图片描述

   //判断是否是小写字母的函数
   //如果是返回非0的值,如果不是返回0
   ret  = islower('a');
   printf("%d\n", ret);
   ret = islower('A');
   printf("%d\n", ret);
   //判断是否是大写字母
    ret = isupper('a');
	printf("%d\n", ret);
	ret = isupper('A');
	printf("%d\n", ret);
	//判断是否是十进制字符
	int ret = isdigit('5');
	printf("%d\n", ret);
	ret = isdigit('a');
	printf("%d\n", ret);
// 判断是否是可打印字符:
	 ret = isprint('a'); //a能够被打印
	printf("%d\n", ret);
	ret = isprint('\n');
	printf("%d\n", ret);
	//判断是否是字母:
	 ret = isalpha('W');
	printf("%d\n", ret);

在这里插入图片描述

(2)字符转换函数:

字符转换函数有
tolower函数 : 将大写字母转换成小写字母
toupper函数:将小写字母转换成大写字母

int main() {
	//将小写字母转换成大写字母
   char ret = toupper('a'); //返回字符的ASCII码值
   printf("%c\n", ret);
     //将大写字母转换成小写字母
   ret = tolower('A');
   printf("%c\n", ret);
   //举例将字符串中的字母全部转换成大写字母:
   char  arr[] = "I am a Student";
   for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
	   if (islower(arr[i])) {
		  arr[i] = toupper(arr[i]);
	   }
   }
   printf("%s\n", arr);
	return 0;
}

在这里插入图片描述

二 字符串函数

(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] = "[email protected]"; 
	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] = "[email protected]"; 
	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;
}

在这里插入图片描述

标签:字符,函数,ret,char,arr2,arr1,printf,字符串
From: https://blog.csdn.net/2301_77993957/article/details/136597778

相关文章

  • C++缺省参数、缺省参数的概念、缺省参数的分类、函数重载、函数重载的概念、C++支持函
    文章目录前言一、缺省参数1.缺省参数的概念2.缺省参数的分类二、函数重载1.函数重载的概念2.C++支持函数重载的原理三、引用1.引用的概念2.引用的特性3.常引用4.引用的使用场景5.传值和传引用效率比较6.引用和指针的区别总结前言C++缺省参数、缺省参数......
  • MySQL 存储函数及调用
    1.mysql存储函数及调用在MySQL中,存储函数(StoredFunction)是一种在数据库中定义的特殊类型的函数,它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑,使得在应用程序中调用时更加简单和高效。下面是一个具体的MySQL存储函数的示例,该函数接受一个整数......
  • private函数如何单元测试
    private函数如何单元测试类的private函数相比public函数,测试套件定义的对象无法直接访问;相比protected函数,亦无法通过前文(protected函数如何单元测试)提到的FRIENT_TEST来使用,那么我们要怎么才能解决这个问题呢?下面来看看具体如何实施。1.首先构建测试套件,定义一个继......
  • python常用函数
    python常用函数一、进制转换#字符串与ASCII码转换print(ord("A"))#65print(chr(65))#A#进制转换print(bin(78))#0b1001110print(oct(78))#0o116print(hex(78))#0x4eprint(int('4e',16))二、数学函数函数返回值(描述)abs(x)返......
  • 字符相关函数的使用以及模拟实现
    库函数中有许多函数与字符串有关,一些常见的有strlen测量字符串的长度,strcpy拷贝字符串到新的字符串下,strcat进行字符串的追加等等,这篇文章会详细实现上述字符串函数的模拟实现。1.strlen的模拟实现首先我们先了解一下strlen函数,strlen是统计字符串内字符的数量的,而字符串的数......
  • C语言——使用函数创建动态内存
    一、堆和栈的区别1)栈(Stack):栈是一种自动分配和释放内存的数据结构,存储函数的参数值、局部变量的值等。栈的特点是后进先出,即最后进入的数据最先出来,类似于我们堆盘子一样。栈的大小和生命周期是由系统自动管理的,不需要程序员手动释放。2)堆(Heap):堆是由程序员手动分配和释......
  • 嵌入式Linux系统编程 — 3.5 utime、utimes、futimens、utimensat函数修改文件时间属
    目录1文件的时间属性简介2utime()函数2.1 utime()函数简介2.2示例程序3 utimes()函数3.1 utimes()函数简介3.2示例程序 4  futimens()函数4.1 futimens()函数简介4.2示例程序5 utimensat()函数5.1 utimensat()函数简介5.2 示例程序1文件的时间......
  • 模版初阶【泛型编程】【函数模版】【类模版】
    模版初阶1.泛型编程如何实现一个通用的交换函数呢?我们先来看一个情景:假设我们需要一个交换的函数,在C语言,我们需要对每一个类型都重新编写一个不同的函数,名字也不能相同。而在c++支持重载后,虽然函数名可以相同,但是我们仍然要对每一种类型都编写一个函数。比如int类要交......
  • Java 数据类型 -- Java 语言的 8 种基本数据类型、字符串与数组
    大家好,我是栗筝i,这篇文章是我的“栗筝i的Java技术栈”专栏的第004篇文章,在“栗筝i的Java技术栈”这个专栏中我会持续为大家更新Java技术相关全套技术栈内容。专栏的主要目标是已经有一定Java开发经验,并希望进一步完善自己对整个Java技术体系来充实自己的......
  • 字符串处理,push pop路径,组合命令
     字符串处理字符串截取、命令嵌套命令格式:%变量名:~m,n%,其中,m表示开始位置(默认开头),n表示从m位置开始向后截取的字符个数(默认到结尾),若n为负数则表示向前截取个数,作用:将命令中的某段字符截取,通过call将字符做为命令执行。@echooffsetstr1=aaaechookbbbecho初始字符......