首页 > 其他分享 >第十六章(字符和字符串函数)

第十六章(字符和字符串函数)

时间:2024-09-24 18:24:36浏览次数:12  
标签:字符 第十六章 p1 int arr ret char printf 字符串

1. 字符分类函数

2. 字符转换函数

3. strlen的使⽤和模拟实现

4. strcpy的使⽤和模拟实现

5. strcat的使⽤和模拟实现

6. strcmp的使⽤和模拟实现

7. strncpy函数的使⽤

8. strncat函数的使⽤

9. strncmp函数的使⽤

10. strstr的使⽤和模拟实现

                 **明月何时照我还**

在编程的过程中,我们往往会遇见字符和字符串,为了方便我C语言就给我们提供了一系列的函数给我们使用。
接下来我们来一一介绍这些函数

一、字符分类函数
我们使用这些库函数需要包含头文件(ctype.h)
在这里插入图片描述
这些函数的使用方法类似,我们就讲解一个作为例子
在这里插入图片描述
islower函数是能判断参数部分C是否是小写字母的
1.是小写字母就返回非零的整数
2.不是小写字母就返回0

我们来练习一下
写一个代码,把小写变成大写,其它字符不变

#include<ctype.h>
int main()
{
	 char arr [10] = "abcdefEE?,";
	 int ret = sizeof(arr) / sizeof(arr[0]);
	 for(int i = 0 ; i<ret ;i++)
	 {
		 if (islower(arr[i]))   //这里用islower函数判断该字符是不是小写
		 {
			 arr[i] = arr[i] - 32;  //如果是小写就变成大写,不是则不动
		 }
	 }
	 for (int i = 0; i < ret; i++)
	 {
		 printf("%c ", arr[i]);
	 }
	
	return 0;
}

在这里插入图片描述
二、c语言提供了2个字符转换函数
1 . int tolower (int c) : 将参数传进去的大写字母转为小写
2 int toupper (int c ) : 将参数传进去的小写字母转为大写

我们对这两种来分别举例子说明

int main()
{
	char arr[15] = "abcdefgGH,.";
	int ret = sizeof(arr) / sizeof(arr[0]);  //计算数组中的元素个数-
	for (int i = 0; i < ret; i++)
	{
		int c = arr[i];
		if (islower(c) != 0)  //如果是小写就转为满足条件,进入
		{
			arr[i] = toupper(c);   // 进入之后将小写转换为大写
		}
	}

	for (int i = 0; i < ret; i++)
	{
		printf("%c ", arr[i]);
	}
	return 0;
}
int main()
{
	char arr[15] = "ABCDEFGJgGH,.";
	int ret = sizeof(arr) / sizeof(arr[0]);  //计算数组中的元素个数-
	for (int i = 0; i < ret; i++)
	{
		int c = arr[i];
		if (isupper(c) != 0)  //如果是大写就转为满足条件,进入
		{
			arr[i] = tolower(c);   // 进入之后将大写转换为小写
		}
	}

	for (int i = 0; i < ret; i++)
	{
		printf("%c ", arr[i]);
	}
	return 0;
}

接下来的函数是针对字符串的

三、 strlen的使用和模拟实现
在这里插入图片描述
作用:计算字符串的大小
在这里插入图片描述

#include<string.h>
int main()
{
	char a[] = "abcdef./,<>";
	 unsigned int  ret = (unsigned int )strlen(a); //这里需要注意strlen函数的返回值是我无符号的整形
	printf("%u ", ret);    //打印无符号整形用%u 
	return 0;
}

strlen函数的模拟实现
1.计数器

int my_strlen(const char* p)
{
	int count = 0;
 	while ((*p) != '\0')  //遇见\0停止
	{
		count++;   //不是\0就加1;
		p++;
	} 
	return count;
}
int main()
{
	char arr[20] = "abcdeffafdsads";
	int ret = my_strlen(arr); // 数组名是数组首元素的地址
	printf("%d", ret);
	return 0;
}

2.指针减去指针

int my_strlen(const char* p)
{
	const char * a = p;  //先创建一个之指针数组把arr的起始地址储存起来
	while ((*p) != '\0')
	{
		p++;    //地址++,直至访问到最后一个字符的地址
	}
	return(int) (p - a);//指针减去指针是一个数组
}

int main()
{
	char arr[20] = "abcdeffafdsads";
	int ret = my_strlen(arr); // 数组名是数组首元素的地址
	printf("%d", ret);
	return 0;
}

四、strcpy函数的使用和模拟
该函数的头文件是(string.h)
在这里插入图片描述
在这里插入图片描述

#include<string.h>
int main()
{
	char a[] = "abcdefddd";
	char copy [40] = {0};
	char* p = strcpy(copy, a);    //strcpy返回的值是复制后字符串的首元素的地址,我们创建一个指针地址来接收
	printf("%s\n", p);
	 p = strcpy(copy,"dsajdjkoajdsjc....");    
	printf("%s\n", p);
	return 0;
}

strcpy函数的模拟实现

#include<string.h>
#include<assert.h> 
char* my_strcpy(char* p1, const char* p2)  //arr1的数组中的字符串是不能改变的
{
	char* p = p1;//先把目标数组的地址储存起来
	assert(p1 != NULL);  //判断p1和p2是不是数组空地址
	assert(p2 != NULL);   //包含一个头文件
	while ((*p2))
	{
		*p1 = *p2;
			p1++;
			p2++;
	}
	/*while((*p1++ = *p2++))
	{
		; //这两种方式都可以实现
	}*/
	return p;  //

}

int main()
{
	char arr1[] = "afcdasdfassda";
	char arr2[40];
	char *ret = my_strcpy(arr2, arr1);// 函数的返回值得到的是目标字符串的首地址
	printf("%s", ret);

	return 0;
}

五、strcat 的使用和模拟实现

在这里插入图片描述
在这里插入图片描述
5.1
strcat函数的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[100] = "dajsdasdsakd";//目标字符串的"\0"会被
	char arr2[10] = "abcdef";  //会被该字符串的首字符a替代,然后依次放入arr2中
	char* p = strcat(arr1, arr2);
	printf("%s \n", p);

	char arr3[100] = "abcedsd";
	char arr4[10] = "gge\0fg";  //提前加上\0
	char* p1 = strcat(arr3, arr4);
	printf("%s \n", p1);

	return 0;
}

5.2
strcat函数的模拟实现

char* my_strcat( char* p1, const char* p2)
{
	char* p = p1;  //先把目标字符串的首地址给储存起来
	//这里我们要先得到目标地址的"\0"出,要在其后链接字符串
	assert(p1 != NULL);
	assert(p2 != NULL);

	while ((*p1))
	{
		p1++; 
	}
	while ((*p1++ = *p2++))
	{
		;
	}
	return p;
}

int main()
{
	char arr1[50] = "abcdef";
	char arr2[10] = "lkjhgfda.";
	char *ret  = my_strcat(arr1, arr2);
	printf("%s ", ret);
	return 0;
}

六、strcmp 函数的使用和实现
在这里插入图片描述

比较两个字符串的大小
在这里插入图片描述
strcmp 函数的使用

int main()
{
	char arr1[10] = "abcefg";
	char arr2[10] = "abcefa";  //比的是字符对应的ASCALL的值
	if ((strcmp(arr1, arr2)))
	{
		int a = strcmp(arr1, arr2);
		printf("%d\n", a);
		printf("arr1大于arr2\n");
	}
	char arr3[10] = "abcefg";
	char arr4[10] = "abcefz";
	if ((strcmp(arr1, arr2)))
	{
		int a = strcmp(arr3, arr4);
		printf("%d\n", a);
		printf("arr3小于arr4\n");
	}
	char arr5[10] = "abcefg";
	char arr6[10] =  "abcefg";
	if ((!strcmp(arr5, arr6)))  //这里两者相等返回值为0,为假我们加上!才能正常执行
	{
		int  a = strcmp(arr5, arr6);
		printf("%d\n", a);
		printf("arr5等于arr6\n");
	}

	return 0;
}

strcmp的模拟实现

int my_strcmp(const char* p1, const char* p2)
{
	assert(p1 != NULL);
	assert(p2 != NULL);
	while ((*p1 == *p2))  //如果相等就继续进入判断,
	{
		if (*p1 == '\0')  //当p1遇见\0就提前截止
		{
			return 0;
		}
		p1++;
		p2++;
	}
	return *p1 - *p2;

}
int main()
{
	char arr1[50] = "abcdefllg";   //这里是比较我们不必要改变
	char arr2[10] = "abcdefllz";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	if (ret > 0)
	{
		printf("arr1>arr2");
	}
	else if (ret < 0)
	{
		printf("arr1<arr2");

	}
	else
	{
		printf("arr1=arr2");
	}

	return 0;
}

七、strncpy 函数的使用
这个与strcpy 有什么不同呢?
在这里插入图片描述

在这里插入图片描述
上代码!

int main()
{
	char a1[50] = "abcdef";
	char a2[10] = "def";
	char * p1 = strncpy (a1, a2, sizeof(a2));//复制2个字符
	printf("%s\n", p1);
	char arr1[50];
	char arr2[30] = "i am a student ";
	char* p2 =  strncpy (arr1, arr2, 5);
	printf("%s\n",p2);
	return 0;
}

八、strncat的使用
在这里插入图片描述
在这里插入图片描述

int main()
{
	char arr1[50];
	char arr2[10];
	strcpy(arr1 , "hello ");  //可以一起使用实现不同的功能
	strcpy(arr2, "i am il;");
	char * p =strncat(arr1, arr2, 4);  //更加灵活了
	printf("%s", p);
	return 0;
}

九、strncmp的函数的使用

在这里插入图片描述

#include<stdio.h>
#include<string.h>
int main()
{

	char arr1[20] = "asdfggh";
	char arr2[20] = "asdfggk";
	int ret = strncmp(arr1, arr2, 7*sizeof(char));
	printf("%d\n", ret);

	return 0;
}

十、strstr的使用和模拟实现
在这里插入图片描述
作用:
查找子字符串
返回指向str1中str2第一次出现的指针,如果str2不是str1的一部分,则返回空指针。匹配过程不包括结束的空字符,但它到此为止。

int main()
{
	char arr[30] = "this is an apple";
	char* pr;
	 pr = strstr(arr, "is");
	printf("%s\n", pr);

	 pr = strstr(arr, "apple");
	printf("%s\n", pr);

	pr = strstr(arr, "er");
	printf("%s\n", pr);
	return 0;
}

标签:字符,第十六章,p1,int,arr,ret,char,printf,字符串
From: https://blog.csdn.net/code_whiter/article/details/142059657

相关文章

  • 【Python学习笔记】字符串
    目录1.定义字符串2.基本操作2.1索引:2.2访问单个字符:2.3访问范围内字符:2.4单个字符编码3.转义符4.运算符5.格式化6.常用字符串函数6.1查找类函数6.2分割类函数6.3字符串连接方法6.4大小写字符转换方法6.5替换方法6.6删除字符串两端、右端或左端连续空白字符......
  • 1071 - 字符图形7-星号菱形
    题目描述输入一个整数n,请打印出n∗2+1行的字符图形。输入一个整数(0<n<10)。输出一个字符图形,如输入2,则产生5行的菱形(为方便找规律,这里将空格用□替代,实际输出,请输出空格)。□□×□××××××××□×××□□×样例输入2输出  * ******** ......
  • 3170. 删除星号以后字典序最小的字符串
    题目链接3170.删除星号以后字典序最小的字符串思路堆栈&位运算题解链接三种写法:26个栈+位运算优化(Python/Java/C++/Go)关键点1.用堆栈跟踪各个字母出现的位置2.用位运算跟踪当前最小字母(lowbit技巧)时间复杂度朴素做法:\(O(n\vert\Sigma\vert)\)位运算......
  • 2207. 字符串中最多数目的子序列
    给你一个下标从0开始的字符串text和另一个下标从0开始且长度为2的字符串pattern,两者都只包含小写英文字母。你可以在text中任意位置插入一个字符,这个插入的字符必须是pattern[0]或者pattern[1]。注意,这个字符可以插入在text开头或者结尾的位置。请你返回插......
  • Leetcode 43. 字符串相乘
    1.题目基本信息1.1.题目描述给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的BigInteger库或直接将输入转换为整数。1.2.题目地址https://leetcode.cn/problems/multiply-strings/descripti......
  • [redis命令]字符串命令
    命令表命令含义SET设置指定key的值GET获取指定key的值GETRANGE返回key中字符串值的子字符GETSET将给定key的值设为value,并返回key的旧值(oldvalue)GETBIT对key所储存的字符串值,获取指定偏移量上的位(bit)MGET获取所有(一个或多个)给定key的值SETBIT......
  • 【CTF Web】BUUCTF SQLi-LABS Page-1(Basic Challenges) Less-3 Writeup(SQL注入+GET请
    sqli-labs1点击启动靶机。SQLi-LABSPage-1(BasicChallenges)解法发送GET请求,id作为参数。http://b38e0f15-7e65-40e6-abf2-fc99e50b38e4.node5.buuoj.cn/Less-3/?id=1返回了用户名和密码。?id=1'发生报错。闭合括号:?id=1');--+正常输出。判断......
  • 【CTF Web】BUUCTF SQLi-LABS Page-1(Basic Challenges) Less-4 Writeup(SQL注入+GET请
    sqli-labs1点击启动靶机。SQLi-LABSPage-1(BasicChallenges)解法发送GET请求,id作为参数。http://b38e0f15-7e65-40e6-abf2-fc99e50b38e4.node5.buuoj.cn/Less-4/?id=1返回了用户名和密码。?id=1'正常输出。?id=1"发生报错。构造闭合:?id=1");--......
  • 统计一个字符在字符串里出现的次数
    统计一个字符在字符串里出现的次数背景在数据库操作中,统计字符串中某个特定字符出现的次数是一个常见需求。无论是分析文本数据、格式化字符串,还是确保数据一致性,字符出现次数的统计对于开发人员和数据库管理员来说都是一项重要任务。这个问题看似简单,但可以通过数据库管理系统的......
  • 将字符串集合转换成逗号分隔字符串的方法
    1.使用String.join()List<String>strList=newArrayList<>();strList.add("aaa");strList.add("bbb");Stringstr=String.join(",",strList);System.out.println(str);结果aa......