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);
}

后记

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

相关推荐
ysu_03141 小时前
03-双链表与循环链表
c语言·数据结构·链表
是隼人2 小时前
buuctf-pwn pwnable_start(ret2shellcode)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
ysu_03143 小时前
02-单链表完全指南
c语言·数据结构·算法·leetcode
ltqshs3 小时前
C语言-链表例程
c语言·开发语言·链表
YYYing.4 小时前
【C++进阶系列 (一)】关于线程堆栈的那些事 (上篇)
c语言·开发语言·c++·线程堆栈
Discipline~Hai4 小时前
Linux网络编程05-sqlite3数据库
linux·c语言·网络·数据库·sqlite·linux应用软件编程
736c4 小时前
C语言-指针 11
c语言
wuyk5557 小时前
104.C 语言字节对齐:从底层原理到工程实践的完整指南
c语言·开发语言·stm32·单片机·嵌入式硬件
南棱笑笑生13 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
2601_9622959919 小时前
嵌入式开发语言用哪个最好,C,python或者其他
c语言·python·嵌入式开发·开发效率·系统资源