前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言学习系列-->字符函数和字符串函数

C语言学习系列-->字符函数和字符串函数

作者头像
南桥
发布2024-01-26 17:47:28
发布2024-01-26 17:47:28
13100
代码可运行
举报
文章被收录于专栏:南桥谈编程南桥谈编程
运行总次数:0
代码可运行

一、字符函数

1、字符分类函数

包含头文件:

代码语言:javascript
代码运行次数:0
运行
复制
#include<ctype.h>

函数

如果它的参数复合下列条件就返回真(一个非零数字)

iscntrl

任何控制字符

任何控制字符

空白字符:空格’ ‘,换页’\f’,换行’\n’,回车’\r’,制表符’\t’或者垂直制表符’\v’

isdigit

十进制数字0~9

isxdigit

十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A-F

islower

小写字母a~z

isupper

大写字母A~Z

isalpha

字母a~z或A-Z

isalnum

字母或者数字,a-z,A-Z ,0~9

ispunct

标点符号,任何不属于数字或者字母的图形字符(可打印)

isgraph

任何图形字符

isprint

任何可打印字符,包括图形字符和空白字符

这些字符函数都很类似,举一个例子

将小写字母转换成大写字母

代码语言:javascript
代码运行次数:0
运行
复制
#include<stdio.h>
#include<ctype.h>

int main()
{
	char str[] = "Test String";
	char c;
	int i = 0;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c = c - 32;
		putchar(c);
		i++;
	}
	return 0;
}

运行结果

代码语言:javascript
代码运行次数:0
运行
复制
TEST STRING.

2、字符转换函数

代码语言:javascript
代码运行次数:0
运行
复制
int tolower ( int c ); //将参数传进去的⼩写字⺟转⼤写
int toupper ( int c ); //将参数传进去的⼤写字⺟转⼩写

我们知道,将小写字母转换成大写是-32,大写字母转换成小写字母是+32

那么,现在有了字符转换函数,就可以直接实现

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (islower(c))
			c = toupper(c);
		putchar(c);
		i++;
	}
	return 0;
}

运行结果

代码语言:javascript
代码运行次数:0
运行
复制
TEST STRING.

二、字符串函数

1、strlen

概述
代码语言:javascript
代码运行次数:0
运行
复制
size_t strlen ( const char * str );

• 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 ‘\0’ )。 • 参数指向的字符串必须要以 ‘\0’ 结束。 • 注意函数的返回值为size_t,是⽆符号的( 易错 ) • 学会strlen函数的模拟实现

模拟实现

法1:

代码语言:javascript
代码运行次数:0
运行
复制
#include<stdio.h>
#include<string.h>
#include<assert.h>

size_t my_strlen(const char* str)
{
	int count = 0;
	assert(str);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "abc";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);
	return 0;
}

法2:

代码语言:javascript
代码运行次数:0
运行
复制
#include<stdio.h>
#include<string.h>
#include<assert.h>

size_t my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

int main()
{
	char arr[] = "abc";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);
	return 0;
}

法3:

代码语言:javascript
代码运行次数:0
运行
复制
#include<stdio.h>
#include<string.h>
#include<assert.h>

size_t my_strlen(char* s)
{
	char* p = s;
	while (*p)
		p++;
	return p - s;
}

int main()
{
	char arr[] = "abc";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);
	return 0;
}

2、strcpy

概述
代码语言:javascript
代码运行次数:0
运行
复制
char * strcpy ( char * destination, const char * source );

• 源字符串必须以 ‘\0’ 结束。 • 会将源字符串中的 ‘\0’ 拷⻉到⽬标空间。 • ⽬标空间必须⾜够⼤,以确保能存放源字符串。 • ⽬标空间必须可变。 • 学会模拟实现。

模拟实现
代码语言:javascript
代码运行次数:0
运行
复制
char my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

3、strcat

概述

• 源字符串必须以 ‘\0’ 结束。 • ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。 • ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。 • ⽬标空间必须可修改。

模拟实现
代码语言:javascript
代码运行次数:0
运行
复制
char my_strcat(char* dest, const char* src)
{
	char* ret = *src;
	assert(dest);
	assert(src);
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src)
	{
		;
	}
	return ret;
}

3、strcmp

概述

标准规定: ◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 ◦ 第⼀个字符串等于第⼆个字符串,则返回0 ◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

模拟实现
代码语言:javascript
代码运行次数:0
运行
复制
int my_strcmp(const char* arr1, const char* arr2)
{
	assert(arr1);
	assert(arr2);
	while (*arr1 == *arr2)
	{
		if (*arr1 == '\0')
			return 0;
		arr1++;
		arr2++;
	}
	return *arr1 - *arr2;
}

4、有限制的字符串函数

前面1-3学习字符串函数,但是那些字符串函数没有个数限制,不安全

下面小编带大家了解一下有个数限制的字符串函数

strncpy
代码语言:javascript
代码运行次数:0
运行
复制
char * strncpy ( char * destination, const char * source, size_t num );

• 拷⻉num个字符从源字符串到⽬标空间。

• 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

strncat
代码语言:javascript
代码运行次数:0
运行
复制
char * strncat ( char * destination, const char * source, size_t num );
代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20];
	char str2[20];
	strcpy(str1, "To be ");
	strcpy(str2, "or not to be");
	strncat(str1, str2, 6);
	printf("%s\n", str1);
	return 0;
}
strncmp
代码语言:javascript
代码运行次数:0
运行
复制
int strncmp ( const char * str1, const char * str2, size_t num );

⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.

4、strstr

概述
代码语言:javascript
代码运行次数:0
运行
复制
char * strstr ( const char *, const char * );

在字符串中找一个子字符串

返回str2在str1中第一次出现的位置 如果str2在str1中没有出现,就返回NULL

模拟实现
代码语言:javascript
代码运行次数:0
运行
复制
#include<stdio.h>
#include<string.h>
#include<assert.h>

const char* my_strstr(const char* str1, const char * str2)
{
	assert(str1);
	assert(str2);

	const char* cp = str1;
	const char* s1 = NULL;
	const char* s2 = NULL;

	//如果子串是空字符串,直接返回str1
	if (*str2 == '\0')
		return str1;

	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 == *s2 && *s1 && *s2)
		{
			s1++;
			s2++;
		}

		if (*s2 == '\0')
			return cp;

		cp++;
	}

	return NULL;
}

int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");

	return 0;
}

图解:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、字符函数
    • 1、字符分类函数
    • 2、字符转换函数
  • 二、字符串函数
    • 1、strlen
      • 概述
      • 模拟实现
    • 2、strcpy
      • 概述
      • 模拟实现
    • 3、strcat
      • 概述
      • 模拟实现
    • 3、strcmp
      • 概述
      • 模拟实现
    • 4、有限制的字符串函数
      • strncpy
      • strncat
      • strncmp
    • 4、strstr
      • 概述
      • 模拟实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档