字符函数与字符串函数

本文详细介绍了C语言中的字符分类函数如islower,isupper等,字符转换函数toupper,tolower,以及字符串函数如strlen,strcpy,strcat,strcmp等的使用方法和模拟实现,通过实例演示了如何运用这些函数处理字符和字符串。
摘要由CSDN通过智能技术生成

欢迎各位来指点我的博客哦!
主页:趋早–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;
}

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

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

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值