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

后记

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

相关推荐
bdgtd881788 小时前
动态修补C扩展模块的函数指针有哪些风险?安全的修补方案是什么?
c语言·开发语言·安全
二级小助手11 小时前
C语言二级考试环境配置教程【window篇】
c语言·全国计算机二级·c语言二级·二级c语言·全国计算机二级c语言·c二级
kyle~12 小时前
C/C++---前缀和(Prefix Sum)
c语言·c++·算法
lidashent12 小时前
c语言-内存管理
java·c语言·rpc
这里没有酒12 小时前
[C语言] 指针的种类
c语言
_OP_CHEN12 小时前
数据结构(C语言篇):(二)顺序表
c语言·数据结构·学习笔记·入门·顺序表·动态顺序表·静态顺序表
knd_max13 小时前
C语言:数据在内存中的存储
c语言
YxVoyager14 小时前
【C++标准库】<ios>详解基于流的 I/O
c语言·c++
j_xxx404_17 小时前
数据结构:单链表的应用(力扣算法题)第一章
c语言·数据结构·算法·leetcode
源远流长jerry18 小时前
STM32之Systick与基础定时器
c语言·stm32·单片机·嵌入式硬件