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 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用