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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)