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

后记

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

相关推荐
森焱森3 小时前
一文理解锂电池充电、过放修复与电量测量:从原理到实战
c语言·单片机·架构
艾莉丝努力练剑4 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法
XH华5 小时前
C语言第一章数据类型和变量(上)
c语言·开发语言
暗影~行星5 小时前
C语言,结构体指针案例
c语言·开发语言
(Charon)5 小时前
C语言手写简易 DNS 客户端(接收部分)
c语言·开发语言
秋说7 小时前
【PTA数据结构 | C语言版】后缀表达式求值
c语言·数据结构·算法
乌萨奇也要立志学C++8 小时前
【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序
c语言
basketball61618 小时前
Linux C 管道文件操作
linux·运维·c语言
ydm_ymz18 小时前
C语言初阶4-数组
c语言·开发语言
灵哎惹,凌沃敏20 小时前
C语言/Keil的register修饰符
c语言·开发语言