首页 > 其他分享 >字符函数与字符串函数

字符函数与字符串函数

时间:2024-03-27 11:02:46浏览次数:24  
标签:字符 return 函数 int char arr1 字符串 include

欢迎各位来指点我的博客哦!
主页:趋早–Step
专栏:C语言
gitte网站:https://gitee.com/good-thg

文章目录

一、字符分类函数

顾名思义,字符分类函数就是用来做字符分类的,就是能够让我们知道这是什么类型的函数,这些函数都需要一个头文件 ctype.h
接下来,就让我们来学习这些函数吧!

我们先来学些最基础的几个函数
islower ----------小写字符a~z
isupper----------大写字母A~Z
isalpha----------所有大小写字母
isdigit------------十进制数字0~9

例题一

这些函数就是用来做判断的,比如说:我现在要判断一个字母是不是小写字母。我该如何判断呢?
首先按照我们以前的方法来:

#include<stdio.h>
int main()
{
	char ch = 0;
	scanf("%c", &ch);
	if (ch>='a' && ch <= 'z')   //  判断输入是否是小写字母
	{
		printf("Yes\n");        // 是小写输出Yes
	}
	else
	{
		printf("No\n"); 	    // 其他类型输出No
	}
	return 0;
}

就让我们运行代码来感受一下这个代码的功能吧!
在这里插入图片描述
在这里插入图片描述
很明显,上面的代码成功的执行了,但是我们能否使用其他方法来实现这个代码呢?是可以的,就是使用我们的字符分类函数,我们上面有说到判断小写字母的函数是islower,而且在使用这个函数时需要包含头文件ctype.h,代码如下:

#include<stdio.h>
#include<ctype.h>     //  包含头文件
int main()
{
	char ch = 0;
	scanf("%c", &ch);
	if (islower(ch))     // 判断
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

我们用同样的测试用例来测试这个代码:
测试结果如下:
在这里插入图片描述
在这里插入图片描述
我们可以看到这两个代码的运行结果都是一样的,但是我们也许会想,这两个代码量都差不多,其实是可以任意选一种的。事实也是如此,但是我们也知道,在有大量代码的时候,字符分类函数就有了很大的作用了,使用这个函数的作用不仅仅是能简化代码,还能避免出错。
我们用例题二来向大家展示:

例题二

从键盘输入一个字符,判断字符类型并且输出对应的提示信息:
输入格式: 输入一个字符
输出格式:
如果该字符是大写字母,输出upper;如果该字符是小写字母,输出lower;如果该字符是数字,输出digit,如果是其他字符,输出other。

代码如下:

#include<stdio.h>
#include<ctype.h>
int main()
{
    char ch;
    scanf("%c", &ch);
    if (isupper(ch))
        printf("upper\n");
    else if (islower(ch))
        printf("lower\n");
    else if (isdigit(ch))
        printf("digit\n");
    else
        printf("other\n");
    return 0;
}

我们来测试一下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过以上用例我们就学会了字符分类函数的使用了,然而我们的字符分类函数还不止这四个,还有以下几个:

iscntrl------------任何控制字符
isspace---------空白字符(空格,换行符等)
isxdigit----------十六进制数字,包括所有十进制数字与所有字母
isalnum---------字母或者数字
ispunct----------标点符号,任何不属于数字或者字母的符号
isgraph----------任何图形字符
isprint------------任何可打印字符

但是这里就不会仔细讲解了,因为这些函数的使用方法都是一样的,只要掌握了其中一个函数的使用方法,剩下的就可以举一反三了。
我们要是还想自学的话,可以从下面网站中学习:

ctype.h-------字符分类函数的使用(其中也有字符转换函数)

二、字符转换函数

在C语言中,有两个字符转换函数,分别是:

toupper---------小写字符转大写
tolower---------大写字母转小写

我们还是使用代码来演示这两个函数的功能:
我们现在要输入一个字母,并且把大写字母转换为小写,小写字母转换为大写。
代码如下:

#include<stdio.h>
#include<ctype.h>
int main()
{
	char ch = 0;
	while (scanf("%c", &ch) != EOF)
	{
		if (islower(ch))
		{
			printf("%c\n", toupper(ch));
		}
		if (isupper(ch))
		{
			printf("%c\n", tolower(ch));
		}
	}
	return 0;
}

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

三、字符串函数

1.strlen

(1)strlen函数的使用

strlen函数的作用是计算字符串的长度,统计字符串中’\0’之前出现的字符个数,我们要注意的是:
1、参数指向的字符串要以’\0’结尾;
2、函数的返回值为size_t
3、strlen函数的使用需要包含头文件string.h
我们使用代码来演示strlen的使用:

#include<stdio.h>
#include<string.h>               //  头文件
int main()
{
	char arr[] = "abcdef";       //  字符串
	size_t len = strlen(arr);    // 求字符串长度,返回值是size_t
	printf("%zd", len);          // 使用%zd打印
	return 0;
}

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

(2)strlen函数的模拟实现

计数器方式实现
#include<stdio.h>
#include<assert.h>
int my_strlen(const char * str)
{
	int count = 0;
	assert(str);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("len = %zd\n", len);
	return 0;
}

代码运行结果如下:
在这里插入图片描述

递归方式(不创建临时变量)
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("len = %zd\n", len);
	return 0;
}

代码运行如下:
在这里插入图片描述

指针 - 指针方式
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
	assert(str);
	char* tmp = str;
	while (*tmp != '\0')
	{
		tmp++;
	}
	return tmp - str;
}
int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("len = %zd\n", len);
	return 0;
}

代码运行如下:
在这里插入图片描述
好的,以上就是strlen函数的使用和模拟实现,我们要一直记得strlen函数使用方法条件。

2、strcpy

(1)strcpy函数的使用

strcpy函数是用来字符串拷贝的
1、源字符串必须以’\0’结尾;
2、会将源字符串中的’\0’拷贝到目标空间;
3、目标空间必须足够大,确保能存放源字符串;
4、目标空间必须课修改。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "hello world";
	char arr2[20] = { 0 };
	strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

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

(2)strcpy函数的模拟实现

代码如下:

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
	char* ret = dest;
	assert(dest && src);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "hello world";
	char arr2[20] = { 0 };
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

代码运行如下:
在这里插入图片描述

3、strcat

(1)strcat的使用

strcat函数是用来连接字符串的
1、源字符串必须以’\0’结束;
2、目标字符串中也有’\0’;
3、目标空间必须足够大,能够源字符串的内容;
4、目标空间可修改。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

代码运行如下:

在这里插入图片描述

(2)strcat的模拟实现

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

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

4、strcmp

(1)strcmp的使用

strcmp是用来比较两个字符串的
1、当第一个字符串大于第二个字符串时,返回大于0的数字;
2、当第一个字符串等于第二个字符串时,返回0;
3、当第一个字符串小于第二个字符串时,返回小于0的数字。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	int ret = strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

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

(2)strcmp的模拟实现

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return str1 - str2;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

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

5、strncpy函数的使用

strncpy是拷贝num个字符从源字符串到目标空间,如果源字符串的长度小于num,则拷贝完字符串后,在目标的后边追加0,直到num个。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[20] = {0};
	strncpy(arr2, arr1,4);
	printf("%s\n", arr2);
	return 0;
}

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

#include<stdio.h>
char* my_strncpy(char* dest, const char* src, int n)
{
	int i = 0;
	for (i = 0; src[i] != '\0' && i < n; i++)
	{
		dest[i] = src[i];
	}
	dest[i] = '\0';
	return dest;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[20] = {0};
	my_strncpy(arr2, arr1, 4);
	printf("%s\n", arr2);
	return 0;
}

运行结果如下:

在这里插入图片描述

6、strncat函数的使用

strncat能够把num个字符追加到另一个字符串后边并且追加一个’\0’

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	strncat(arr1, arr2, 5);
	printf("%s\n", arr1);
	return 0;
}

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

7、strncmp函数的使用

strncmp是比较两个字符串前num个字符的大小

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "abcde";
	char arr2[] = "abdef";
	int ret = strncmp(arr1, arr2, 4);
	printf("%d\n", ret);
	return 0;
}

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

8、strstr

(1)strstr的使用

strstr是用来在一个字符串中查找另一个字符串的,返回的是这个字符串在另一个字符串中第一次出现的位置;如果找不到,则返回空指针。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "hello world";
	const char* p = "or";
	char* ret = strstr(arr1, p);
	printf("%s\n", ret);
	return 0;
}

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

(2)strstr的模拟实现

#include<stdio.h>
char* my_strstr(const char* str1, const char* str2)
{
	const char* s1 = str1;
	const char* s2 = str2;
	const char* cur = str1;
	if (*str2 == '\0')
	{
		return (char*)str1;
	}
	while (*cur)
	{
		s1 = cur;
		s2 = str2;
		while (*s1!='\0'&&*s2!='\0'&& * s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cur;
		}
		cur++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "hello world";
	char arr2[] = "or";
	char* ret = my_strstr(arr1, arr2);
	printf("%s\n", ret);
	return 0;
}

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

9、strtok的使用

strtok可以把字符串中用分隔符隔开的串提取出来

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abc.defhij@kkk";
	char arr2[30] = { 0 };
	strcpy(arr2, arr1);
	const char* sep = ".@";
	char* ret = NULL;
	for (ret = strtok(arr2, sep); ret != NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);
	}
	return 0;
}

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

10、strerror的使用

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
让我们来打印一下1–10的错误对应的信息
在这里插入图片描述
让我们来使用一下这个函数:

#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
	FILE* pf = fopen("learn.txt", "r");   // 打开文件
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	fclose(pf);                           // 关闭文件
	return 0;
}

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

11、perror

perror可以直接把错误信息打印出来

#include<stdio.h>
int main()
{
	FILE* pf = fopen("learn.txt", "r");   
	if (pf == NULL)
	{
		perror("problem");
		return 1;
	}
	fclose(pf);                           
	return 0;
}

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

好了,到这里咱们《字符函数与字符串函数》部分就结束了,我们学习了很多函数的使用以及他们的模拟实现。我们在平时的练习中要多多使用来巩固它们!

标签:字符,return,函数,int,char,arr1,字符串,include
From: https://blog.csdn.net/2301_82247031/article/details/137022532

相关文章

  • 【go从入门到精通】函数详解
    作者简介:    高科,先后在 IBMPlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你的关注)---------------......
  • PHP常用的无参函数绕过
    PHP常用的无参函数绕过getallheaders()这个函数的内容就是获取http所有的头部信息。接着我们可以用var_dump函数来把函数的执行结果都打印出来。这个函数有一个缺陷,它只能在apache中间件环境下使用。我们来在本地测试一下无参函数的具体效果。测试代码:<?phphighlight_file(__......
  • Unix系统上使用semop函数写一个信号量函数,确保只有一个进程能访问临界资源
    semop是Unix系统调用,用于操作信号量集。信号量是一种用于保护共享资源或临界区域免受并发访问的同步原语。以下是一个使用semop的简单示例,确保只有一个进程能访问临界资源:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<......
  • 《深入理解计算机系统》学习(4):过程(如函数)和栈存储
    目录过程1运行时栈2转移控制3数据传送4栈上局部存储过程过程中是软件中一种很重要的抽象,提供了一种封装代码的方式,用一组指定的参数和一个可选的返回值实现了某种功能。然后,可以在程序的不同的地方使用这个功能。设计良好的软件用过程作为抽象机制,隐藏某个行为......
  • C++的format函数
    C++20引入了<format>库,它提供了类似于Python的格式化字符串的功能。你可以使用std::format函数来格式化字符串。format   格式控制标记  [[fill]align][sign][#][0][wigth][precision][type]下面依次讲解format的格式控制标记的基本用法:1.[[fill]align]这个格式......
  • 05-python函数进阶和文件
    函数函数的多返回值变量间逗号隔开,可以多种类型defhello():return1,True,"hello"x,y,z=hello()函数的传参方式位置参数,根据位置传参defcan1(x,y,z):print(x,y,z)can1(2,4,8)关键字参数,根据k=v传参,可以和位置参数混用,位置参数需要在前defcan2......
  • Oracle数据库入门第三课(函数)
    前面二白讲了一些简单的查询语句,仅仅知道查询语句的语法是不够的,要想实现更多的需求,更重要的是函数的使用,这节课我们简单说一下一些函数的使用。一、函数的分类什么叫做函数?函数就是用来实现某种功能的,提前声明好的代码块分类:•系统函数         ‣单行函数......
  • Linux系列之统计某个字符串出现次数并排序
    业务场景最近遇到一个流量异常调用的接口,所以需要通过后台日志查看接口调用情况,先统计今天内接口的调用次数,再具体到对应的设备号,就知道哪台设备有问题了,初步想到wc和awk命令来筛选统计,但是真正去写的时候,发现很多写法都不太记得了,所以花了点时间去查手册,找资料,现在整理成......
  • 字符串 hash
    (由于字符串hash和整数hash是两个东西,以下将字符串hash称作strash)前情提要:strash:我来!(非常好数据,使我的strashWA掉)strash是什么?strash有什么用?该如何避免上述情况?strash是什么strash的原理其实很简单:将一个字符串当作\(b\)进制数。Soyouwroteawrongcod......
  • js使用正则从字符串中取出img标签
    要使用正则表达式从字符串中提取<img>标签,您可以使用以下代码:conststr=`Sometext<imgsrc="image.jpg"alt="Image">andmoretext<imgsrc="another.png"alt="Another">`;constregex=/<img[^>]*>/g;constimgTags......