C语言:字符函数和字符串函数

往期文章

  1. C语言:初识C语言
  2. C语言:分支语句和循环语句
  3. C语言:函数
  4. C语言:数组
  5. C语言:操作符详解
  6. C语言:指针详解
  7. C语言:结构体
  8. C语言:数据的存储

目录

  • 往期文章
  • 前言
  • [1. 函数介绍](#1. 函数介绍)
    • [1.1 strlen](#1.1 strlen)
    • [1.2 strcpy](#1.2 strcpy)
    • [1.3 strcat](#1.3 strcat)
    • [1.4 strcmp](#1.4 strcmp)
    • [1.5. strncpy](#1.5. strncpy)
    • [1.6 strncat](#1.6 strncat)
    • [1.7 strncmp](#1.7 strncmp)
    • [1.8 strstr](#1.8 strstr)
    • [1.8 strtok](#1.8 strtok)
    • [1.9 strerror](#1.9 strerror)
    • [1.10 memcpy](#1.10 memcpy)
    • [1.11 memmove](#1.11 memmove)
    • [1.12 memcmp](#1.12 memcmp)
  • [2. 库函数的模拟实现](#2. 库函数的模拟实现)
    • [2.1 strcpy的模拟实现](#2.1 strcpy的模拟实现)
    • [2.2 stract 的模拟实现](#2.2 stract 的模拟实现)
    • [2.3 strmcp的模拟实现](#2.3 strmcp的模拟实现)
    • [2.4 strstr的模拟实现](#2.4 strstr的模拟实现)
    • [2.5 memcpy的模拟实现](#2.5 memcpy的模拟实现)
    • [2.6 memmove的模拟实现](#2.6 memmove的模拟实现)
  • 后记

前言

今天来盘一下字符函数和字符串函数。

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数。

1. 函数介绍

1.1 strlen

注意,strlen的返回值是无符号整数

1.2 strcpy

1.3 strcat

1.4 strcmp

1.5. strncpy

1.6 strncat

1.7 strncmp


1.8 strstr

1.8 strtok

1.9 strerror

1.10 memcpy

1.11 memmove

1.12 memcmp

2. 库函数的模拟实现

2.1 strcpy的模拟实现

c 复制代码
#include<stdio.h>
#include<assert.h>

void  my_strcpy(char *dest,const char *src)
{
	assert(dest != NULL);
	assert(src != NULL);

	while (*dest++ = *src++)
	{
		;
	}
	*dest = *src;
}
int main()
{
	char arr1[20] = "********************";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

2.2 stract 的模拟实现

c 复制代码
#include<stdio.h>
#include<assert.h>

char* my_strcat(char *dest,char *src)
{
	assert(dest);
	assert(src);
	char *ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	
	printf("%s\n", my_strcat(arr1, arr2));
	return 0;
}

2.3 strmcp的模拟实现

c 复制代码
#include<stdio.h>
#include<assert.h>

int my_strcmp(char *s1, char *s2)
{
	assert(s1);
	assert(s2);
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	return *s1 - *s2;
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	printf("%d\n", my_strcmp("abd", "abp"));
	return 0;
}

2.4 strstr的模拟实现

c 复制代码
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char *s1, const char *s2)
{
	assert(s1&&s2);
	char *cp = s1;
	while (*cp)
	{
		char *p1 = cp;
		char *p2 = s2;
		while (*p1!='\0'&&*p2!='\0'&&*p1 == *p2)
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
		{
			return cp;
		}
		cp++;
	}
	return NULL;
}

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

	return 0;
}

2.5 memcpy的模拟实现

c 复制代码
void * memcpy ( void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst);
assert(src);
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}

2.6 memmove的模拟实现

c 复制代码
void * memmove(void * dst, const void * src, size_t count)
{
	void * ret = dst;
	if (dst <= src || (char *)dst >= ((char *)src + count)) {
		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst + 1;
			src = (char *)src + 1;
		}
	}
	else {
		/*
		* Overlapping Buffers
		* copy from higher addresses to lower addresses
		*/
		dst = (char *)dst + count - 1;
		src = (char *)src + count - 1;
		while (count--) {
			*(char *)dst = *(char *)src;
			dst = (char *)dst - 1;
			src = (char *)src - 1;
		}
	}
	return(ret);
}

后记

本篇博客就分享到这里啦,希望对大家有所帮助。事实证明,我暑假还没有好好做人。

相关推荐
小莞尔17 小时前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
小莞尔17 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
liujing1023292917 小时前
Day03_刷题niuke20250915
c语言
第七序章20 小时前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
l1t1 天前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
l1t1 天前
利用美团龙猫用libxml2编写XML转CSV文件C程序
xml·c语言·libxml2·解析器
Gu_shiwww1 天前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
你怎么知道我是队长1 天前
C语言---循环结构
c语言·开发语言·算法
程序猿编码1 天前
基于 Linux 内核模块的字符设备 FIFO 驱动设计与实现解析(C/C++代码实现)
linux·c语言·c++·内核模块·fifo·字符设备
mark-puls1 天前
C语言打印爱心
c语言·开发语言·算法