当前位置: 首页 > article >正文

C语言之字符函数和字符串函数(上)

欢迎拜访:雾里看山-CSDN博客
本篇主题:C语言之字符函数和字符串函数(上)
发布时间:2025.1.17
隶属专栏:C语言

在这里插入图片描述

目录

  • 求字符串长度
    • strlen
      • 函数介绍
      • 函数使用
      • 函数实现
  • 长度不受限制的字符串函数
    • strcpy
      • 函数介绍
      • 函数使用
      • 函数实现
    • strcat
      • 函数介绍
      • 函数使用
      • 函数实现
    • strcmp
      • 函数介绍
      • 函数使用
      • 函数实现
  • 长度受限制的字符串函数
    • strncpy
      • 函数介绍
      • 函数使用
      • 函数实现
    • strncat
      • 函数介绍
      • 函数使用
      • 函数实现
    • strncmp
      • 函数介绍
      • 函数使用
      • 函数实现

求字符串长度

strlen

函数介绍

strlen
函数格式size_t strlen(const char* str);
功能:C语言中字符串的长度由结束的\0决定。字符串的长度等于字符串开头和结束的\0之间的字符数(不包括结束的\0本身)。
返回值无符号整数(size_t) 表示这个字符串的长度。
头文件strlen函数的声明在string.h的头文件中,在使用时,要使用#include <string.h>操作包含头文件。
特别注意

  1. str字符串必须以\0结尾。

函数使用

#include <stdio.h>
#include <string.h>

int main()
{
	char c[100] = "abcdefg";
	size_t n = strlen(c);
	printf("字符串的长度 = %d\n字符串的大小 = %d\n", n, sizeof(c));
	return 0;
}

在这里插入图片描述

函数实现

  1. 计数器方式
size_t my_strlen(const char* str)
{
	size_t count = 0;
	for (int i = 0; str[i] != '\0'; i++)
	{
		count++;
	}
	return count;
}
  1. 递归方式
size_t my_strlen(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return my_strlen(str + 1) + 1;
}
  1. 指针方式
size_t my_strlen(const char* str)
{
	char* p = str;
	while (*p != '\0')
	{
		p++;
	}
	return p - str;
}

长度不受限制的字符串函数

strcpy

函数介绍

strcpy
函数格式char* strcpy(char* destination, const char* source);
功能:将source指向的字符串复制到destination指向的字符数组中,包括结束的\0字符(并在该点停止)。
返回值:返回被拷贝的字符数组destination
头文件strcpy函数在string.h的头文件中,在使用时,要使用#include <string.h>操作包含头文件。
特别注意

  1. 字符数组destination必须有足够的空间来存放source里的数据。`
  2. source必须以\0`结尾。
  3. 字符数组destination必须可修改。

函数使用

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = "xxxxxxxxxxxxxxx";
	char arr2[] = "hello world";
	char arr3[] = "xxxxxxxxxxxxxxx";
	char arr4[6] = { 'a', 'b', 'c', 'd', 'e', '\0' };
	strcpy(arr1, arr2);
	strcpy(arr3, arr4);
	printf("%s\n", arr1);
	printf("%s\n", arr3);
	return 0;
}

在这里插入图片描述

函数实现

方法一:

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;//记录起始地址
	assert(dest != NULL);
	assert(src != NULL);

	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//处理 '\0'

	return ret;
}

方法二:

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;//记录起始地址
	assert(dest != NULL);
	assert(src != NULL);

	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

strcat

函数介绍

strcat
函数格式char *strcat(char *destination, const char *source);
功能:将source字符串的副本追加到destination字符串。destination中的结束\0字符被source的第一个字符覆盖,并且在destination中由两者串联形成的新字符串的末尾包含一个\0;
返回值:返回被追加的字符数组destination
头文件strcat函数在string.h的头文件中,在使用时,要使用#include <string.h>操作包含头文件。
特别注意

  1. 字符数组destination必须有足够的空间来存放source里的数据。
  2. source必须以\0结尾。
  3. 字符数组destination必须可修改。

函数使用

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";

	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

在这里插入图片描述

函数实现

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;//记录起始地址
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)//找目标空间的\0
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

strcmp

函数介绍

strcmp
函数格式int strcmp(const char *str1, const char *str2);
功能:这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续执行以下对,直到字符不同或达到终止空字符为止。
返回值:返回一个整数

返回值结果
>0str1 大于 str2
=0str1 等于 str2
<0str1 小于 str2

头文件strcmp函数在string.h的头文件中,在使用时,要使用#include <string.h>操作包含头文件。
特别注意

  1. 字符之间的比较是使用的ASCII码值进行比较的

函数使用

#include <stdio.h>
#include <string.h>

int main()
{

	printf("%d\n", strcmp("abcd", "abcc"));
	printf("%d\n", strcmp("abca", "abcc"));
	printf("%d\n", strcmp("abcd", "abcd"));
	return 0;
}

函数实现

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return (*str1 - *str2);
}

长度受限制的字符串函数

strncpy

函数介绍

strncpy
函数格式char *strncpy(char *destination, const char *source, size_t num);
功能:将source的前num字符复制到destination。如果在复制num个字符之前找到源C字符串的结尾(由\0表示),则目的地将用0填充,直到总共写入num个字符为止。
返回值:返回被拷贝的字符数组destination
头文件strncpy函数在string.h的头文件中,在使用时,要使用#include <string.h>操作包含头文件。
特别注意

  1. 字符数组destination必须有足够的空间来存放source里的数据。
  2. 字符数组destination必须可修改。
  3. 如果source大于num,则不会在destination的末尾隐式添加\0字符。因此,在这种情况下,destination不应被视为以\0结束的C字符串(这样直接读取会溢出)。
  4. sourcedestination不可重叠。

函数使用

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "abcdefg";
	char str2[] = "xxx";
	strncpy(str1, str2, 5);
	printf("%s\n", str1);
	
	return 0;
}

在这里插入图片描述

函数实现

char* my_strncpy(char* dest, const char* src, size_t num)
{
	char* ret = dest;//记录起始地址
	assert(dest != NULL);
	assert(src != NULL);

	for (int i = 0; i < num; i++)
	{
		*dest = *src;
		dest++;
		src++;
	}

	return ret;
}

strncat

函数介绍

strncat
函数格式char *strcat(char *destination, const char *source, size_t num);
功能:将source的前num个字符追加到destination,加上一个结束的\0字符。
返回值:返回被追加的字符数组destination
头文件strncat函数在string.h的头文件中,在使用时,要使用#include <string.h>操作包含头文件。
特别注意

  1. 字符数组destination必须有足够的空间来存放source里的数据。
  2. 如果 source中的字符串的长度小于num,则只复制结束\0字符之前的内容。。
  3. 字符数组destination必须可修改。

函数使用

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";

	strncat(arr1, arr2, 10);
	printf("%s\n", arr1);
	return 0;
}

在这里插入图片描述

函数实现

char* my_strncat(char* dest, const char* src, size_t num)
{
	char* ret = dest;//记录起始地址
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)//找目标空间的\0
	{
		dest++;
	}
	for (int i = 0; i < num; i++)
	{
		if (*src == '\0')
			break;
		*dest++ = *src++;
	}
	*dest = '\0';//结尾追加 \0 
	return ret;
}

strncmp

函数介绍

strncmp
函数格式int strcmp(const char *str1, const char *str2, size_t num);
功能:比较字符串str1和字符串str2的最多num个字符。
返回值:返回一个整数

返回值结果
>0str1 大于 str2
=0str1 等于 str2
<0str1 小于 str2

头文件strncmp函数在string.h的头文件中,在使用时,要使用#include <string.h>操作包含头文件。
特别注意

  1. 字符之间的比较是使用的ASCII码值进行比较的
  2. 这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续执行后面的对,直到字符不相同,直到 遇到终止的\0字符, 或者直到 两个字符串中的num字符匹配,才返回结果。

函数使用

#include <stdio.h>
#include <string.h>

int main()
{
	char str1[] = "abcdefg";
	char str2[] = "abcffg";
 
	printf("%d\n", strncmp(str1,str2,4));
	return 0;
}

函数实现

int my_strncmp(const char* str1, const char* str2, size_t num)
{
	assert(str1 != NULL);
	assert(str2 != NULL);

	for (int i = 0; i < num; i++)
	{
		if (*str1 == *str2)
		{
			if (*str1 == '\0')
				return 0;
			str1++;
			str2++;
			continue;
		}
		return (*str1 - *str2);
	}
	return 0;
}

⚠️ 写在最后:以上内容是我在学习以后得一些总结和概括,如有错误或者需要补充的地方欢迎各位大佬评论或者私信我交流!!!


http://www.kler.cn/a/508614.html

相关文章:

  • 【数据库】MySQL数据库SQL语句汇总
  • python如何解析word文件格式(.docx)
  • mongoose 支持https踩坑纪实
  • 基础入门-反弹Shell渗透命令Reverse反向Bind正向利用语言文件下载多姿势
  • idea 如何安装 github copilot
  • SQLite 3.48.0 发布,有哪些更新?
  • Vue3实现表格搜索内容高亮
  • Kotlin Bytedeco OpenCV 图像图像57 图像ROI
  • BUUCTF Web
  • 哪些新兴技术对智能驾驶汽车影响最大?
  • Neo4j与Python交互
  • FFMpeg的一些常用命令
  • 一探究竟:如何高效提取ULL中的当前参数,实现性能与精度的完美平衡
  • 矩阵碰一碰发视频源码技术开发全解析,支持OEM
  • 【9.1】Golang后端开发系列--Gin快速入门指南
  • 机器学习(3):逻辑回归
  • CAP:Serverless + AI 让应用开发更简单
  • 分频器code
  • Java-数据结构-二叉树(配图详解)
  • SQL Server 导入Excel数据
  • 【Gossip 协议】Golang的实现库Memberlist 库简介
  • 深度学习项目--基于LSTM的火灾预测研究(pytorch实现)
  • 下定决心不去读研了。。。
  • Vue3组件通信进阶: 大型项目中Provide/Inject与EventBus的实战应用
  • Python基本概念与实践
  • 非安全函数