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语言内存函数
c语言·后端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言
czy87874755 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
m0_531237175 天前
C语言-数组练习进阶
c语言·开发语言·算法
Z9fish5 天前
sse哈工大C语言编程练习23
c语言·数据结构·算法
代码无bug抓狂人5 天前
C语言之单词方阵——深搜(很好的深搜例题)
c语言·开发语言·算法·深度优先
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习
枫叶丹45 天前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
with-the-flow5 天前
从数学底层的底层原理来讲 random 的函数是怎么实现的
c语言·python·算法
Sunsets_Red5 天前
P8277 [USACO22OPEN] Up Down Subsequence P 题解
c语言·c++·算法·c#·学习方法·洛谷·信息学竞赛