C语言进阶【1】--字符函数和字符串函数【1】

2024-09-08 09:44

本文主要是介绍C语言进阶【1】--字符函数和字符串函数【1】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本章概述

  • 字符分类函数
  • 字符转换函数
  • strlen的使用和模拟实现
  • strcpy的使用和模拟实现
  • strcat的使用和模拟实现
  • strcmp的使用和模拟实现
  • 彩蛋时刻!!!

字符分类函数

  • 字符: 这个概念,我们在以前的文章中讲过了。我们键盘输入的信息都是字符。字符大体可以分为两类——单个字符字符串。而单个字符又可以进行分类——字母字符数字字符特殊字符不可见字符。进行思维图展示:在这里插入图片描述
    在日常生活中,我们写的字符也就是随便写,比如,123,abc……。但在C语言中为了识别出字符和字符串,我们就要用两个操作符——' '" "' '用来识别单个字符的," "用来识别字符串的。
    我们对于所写的字符,我们人都能识别出来。A我们能识别它是大写,a我们能识别它是小写,1我们能识别它是数字。但是,计算机是无法识别出来的,所以,为了能够让计算机识别,我们就创建了字符分类函数。我们进行展示:在这里插入图片描述
    它们的头文件是:<ctype.h>,当条件为真时,就会返回大于0的数值,反之返回小于0的数值。这些字符分类函数的用法都是相同,所以我们举一个就行了(常用的),比如,islower判断是否小写的函数。我们先来看它的类型和参数:
//	int islower (int c)

进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <ctype.h>
int main()
{int c = islower('a');int b = islower('A');if (c > 0)printf("%c是小写\n", 'a');elseprintf("%c是大写\n", 'a');if (b > 0)printf("%c是小写\n", 'A');elseprintf("%c是大写\n", 'A');return 0;
}

结果运行图:在这里插入图片描述
对于其它字符分类函数的使用,大家可以点击连接进行学习使用:https://cplusplus.com/reference/clibrary/

字符转换函数

C语言中就俩字符转换函数,它们的头文件是 <ctype.h>,如下:

//	大写转小写:int  tolower (int c)
//	小写转大写:int  toupper  (int c)

进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main()
{int c = toupper('a');	//转大写printf("%c\n", c);int b = tolower('A');	//转小写printf("%c\n", b);return 0;
}

结果运行图:在这里插入图片描述
我们来写个程序,运用我们所学的知识:

//	我们写一句英文,然后,把我们所写的英文全部转换为大写,比如:
//	I am a student.-------> I AM A STUDENT.
//	我们来写两个方法进行实现。

程序【1】

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main()
{char arr[] = "I am a student.";int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;printf("转换前:%s\n", arr);for (i = 0; i < sz; i++){if (islower(arr[i]))arr[i] = arr[i] - 32;	//大写字母的AS||值比小写字母的AS||值少32}printf("转换后:%s\n",arr);return 0;
}

结果运行图:在这里插入图片描述
程序【2】。

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "I am a student.";int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;printf("转换前:%s\n", arr);for (i = 0; i < sz; i++){if(islower(arr[i]))arr[i]=toupper(arr[i]);	//使用 toupper进行转换}printf("转换后:%s\n",arr);return 0;
}

结果运行图:在这里插入图片描述
大家也可以进行举一反三,比如,大写转小写代码。

strlen的使用和模拟实现

  • strlen的使用:后面,我们要开始讲字符串相关的函数了,它们的头文件<string.h>。前面,咱们已经讲过了strlen的使用和模拟实现,今天在复习一下。我们知道,每个字符串后面都会自动补\0,strlen统计的是\0之前的字符串的长度。进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "abcdef";printf("%zd", strlen(arr));return 0;
}

结果运行图:在这里插入图片描述
对于strlen的返回值打印最好要用%zd。因为strlen返回值类型为size_t(无符号整形),关于为什么是size_t的类型,咱们在以前的文章中讲过了。
我们还可以指定它的统计起始位置,进行代码展示:下面展示一些 内联代码片

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "abcdef";printf("%zd", strlen(arr+1));	//从b开始进行统计,所以统计数为:5.return 0;
}

结果运行图展示:在这里插入图片描述

  • strlen的模拟:
//	咱们写三种方法进行实现。
// 	思路:统计\0之前的字符数。

方法【1】----计数器的方式

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{int count = 0;int i = 0;while (arr[i]){count++;i++;}return count;
}
int main()
{char arr[] = "abcdef";printf("%zd\n", my_strlen(arr));return 0;
}

结果运行图:在这里插入图片描述
方法【2】----指针-指针

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{char*s1=arr;while (*arr){arr++;}return arr-s1;
}
int main()
{char arr[] = "abcdef";printf("%zd\n", my_strlen(arr));return 0;
}

结果运行图:在这里插入图片描述
方法【3】----递归函数
进行如图所示的逻辑:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{if (*arr){arr++;return 1 + my_strlen(arr);}elsereturn 0;}
int main()
{char arr[] = "abcdef";printf("%zd\n", my_strlen(arr));return 0;
}

结果运行图:在这里插入图片描述
在这三种方法都很好,都是使用了我们所学过的知识,大家要掌握。

strcpy的使用和模拟实现

  • strcpy的使用: 具有拷贝字符串的功能。比如,A字符串拷向B字符串,B字符串拷向A字符串,自己向自己拷贝。 我们来看它的结构组成:
//		char * strncpy ( char * destination, const char * source );|								|					||								|					||								|					|
返回的是des的地址(未更改前的)	     目的地的地址	       拷贝源的地址//		因为我们不想拷贝来源的时候,发生更改,所以用const修饰。
  • 它的使用有几个要注意的点
    • 1.拷贝的来源必须以' \0'结尾
    • 2.dest的空间要足够大,要容的下要拷贝的内容。
    • 3.des的空间是要可修改的,要不然就无法拷贝。
    • 4 .拷贝的时候,也会把source的' \0'拷贝过去
    • 5.拷贝的起始位置是可以指定的(des和source都可以指定起始位置,指定的方式和strlen一样)
  • 进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "abcedf";char arr1[30]={0};printf("拷贝前arr1:%s\n",arr1);printf("拷贝后arr1:%s\n", strcpy(arr1, arr));return 0;
}

结果运行图:

  • strcpy的模拟实现:
//		遇到source的' \0'就会拷贝停止,但也要把' \0'拷贝过去

进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* des, const char* str)
{char* p = des;			//因为经过后面的程序后,des的值早变了,所以要先给cpy一份assert(des && str);		//判断一下,des和str是否为空指针while (*des++=*str++){;}return p;
}
int main()
{char arr[] = "abcedf";char arr1[30] = {0};printf("拷贝前arr1:%s\n",arr1);printf("拷贝后arr1:%s\n", my_strcpy(arr1, arr));return 0;
}

结果运行图:在这里插入图片描述

strcat的使用和模拟实现

  • strcat的使用它具有在字符串的后面补上别的字符串的功能。比如:
// char arr[30]="abd" ;
// char arr1[4]="acd" ;
//  arr1向arr的末尾补齐------->"abdacd"
  • 它的结构所示:
//  char * strcat(char *dest, const char*src)
//		返回值和每个参数的意思和strcpy是一样的
  • 它的使用要注意的点
    • 1.src会找到des的第一个出现的' \0',在此处把src的字符串补充到des中(此时的’ \0’会被覆盖)。
    • 2 .由于des的’ \0’被覆盖了,所以str在补充字符串后,会在末尾添加’\0’。占别人的东西,最后肯定要还的!
    • 3.des的空间要够大,要容得下补充后的字符空间。
    • 4 .补充的起始位置是可以指定的(des和str都可以指定起始位置,指定的方式和strlen一样)
  • 进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{char arr[30] ="abcdef";char arr1[] = "xxx";printf("%s\n", strcat(arr, arr1));return 0;
}

结果运行图:在这里插入图片描述

  • strcat的模拟实现思路我们要找到des的’\0’, 才能进行补充。进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* des, const char* str)
{char* p = des;assert(des && str);while (*des)des++;while (*des++=*str++){;}return p;
}
int main()
{char arr[30] ="abcdef";char arr1[] = "xxx";printf("%s\n", my_strcat(arr, arr1));return 0;
}

结果运行图:在这里插入图片描述

strcmp的使用和模拟实现

  • strcmp的使用:是用来比较字符串的大小的。它比较的可不是两个字符串的长度大小比较的是每单个字符的大小(就是比较两个单个字符的AS||值的大小)。结构组成如下:
//		int strcmp (const char * str1, const char * str2)
  • 要注意的几点:
    • 1.比较的顺序就是所输入的数据,比如,输入顺序:str1 ,str2。 比较顺序:str1 ,str2。 输入顺序:str2 ,str1。 比较顺序:str2 ,str1。
    • 2 .str1 > str2就会返回大于0的数值。str1<str2就会返回小于0的值。str1=str2就会返回0
    • 3.因为我们要比较两个字符串的大小,所比较的内容不能被更改,所以参数要用const修饰。
    • 4 .比较的起始位置是可以指定的(str1和str2都可以指定起始位置,指定的方式和strlen一样)
  • 进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{char arr[30] ="abcdef";char arr1[] = "abx";printf("%d\n", strcmp(arr, arr1));return 0;
}

结果运行图:在这里插入图片描述
大家可自行试一下,对于和等于的代码。

  • strcmp的模拟实现比较的AS||值的大小,进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <assert.h>
#include <string.h>
int my_strcmp(const char* e1, const char* e2)
{while (*e1 == *e2){e1++;e2++;if (*e1 == '\0' || *e2 == '\0')break;}return *(int*)e1 - *(int*)e2;
}
int main()
{char arr[30] = "abcdef";char arr1[] = "abx";printf("%d\n", my_strcmp(arr, arr1));return 0;
}

结果运行图:在这里插入图片描述

彩蛋时刻!!!

https://www.bilibili.com/video/BV1Ze4y1F7CV/?spm_id_from=333.337.search-card.all.click
在这里插入图片描述每章一句总有人翘首以盼为你而来。感谢你能看到这里,点赞+关注+收藏+转发是对我最大的鼓励,咱们下期间!!!

这篇关于C语言进阶【1】--字符函数和字符串函数【1】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147764

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作