C语言实现常用字符串库函数(推荐)

目录
  • 一、实现memcpy
  • 二、memmove模拟实现
  • 三、strlen的模拟实现
    • 1.计数器方法:
    • 2.递归方式:
    • 3.利用指针实现:
  • 四、strcpy的模拟实现
  • 五、strcmp的模拟实现
  • 六、strstr模拟实现
  • 七、模拟实现strcat

一、实现memcpy

将src所指向的内容拷贝到dst所指向的位置,拷贝len个字节。

  • memcpy是内存拷贝函数
  • memcpy在使用的时候不用考虑类型,以字节为单位进行拷贝
  • 遇到"\0"的时候不会停下,所以拷贝字符串的时候最好还是用strcpy,它更安全。
void *Mymemcpy(void * dst, const void * src, int len){
	void *ret = dst;
	assert(src);
	assert(dst);
	while (len--){
		*(char *)dst = *(char *)src;
		dst = (char *)dst + 1;
		src = (char *)src + 1;
	}
	return ret;
}
int main(){
	char str[100] = "ABCDE";
	Mymemcpy(str, str + 2, 2);
	printf("%s", str);
	system("pause");
	return 0;
}

但是当我们修改了测试用例后发现了如下结果

出现这种情况的原因很简单,因为我们源字符串的首地址低于目标字符串的首地址,当我们默认从左向右拷贝的时候第一个字符串会覆盖第二个字符串,所以出现了全A的情况,这就是内存重叠拷贝,要解决这个问题非常简单,只需要在拷贝之前加一个判断,如果源字符串的首地址低于目标字符串的首地址则我们从右向左拷贝,这样就可以完美解决这个问题。

二、memmove模拟实现

这里我们重复刚才的测试用例,发现加入了判断并从右向左拷贝了之后没有出现全A的情况。

void * Mymemmove(void * dst, const void *src, int len){

	char *_src = (char*)src;
	char *_dst = (char*)dst;
	if (_dst > _src&&_dst < _src + len){
		_dst = _dst + len - 1;
		_src = _src + len - 1;

		while (len--){
			*_dst = *_src;
			_dst--;
			_src--;
		}
	}
	else {
		while (len--){
			*_dst = *_src;
			_dst++;
			_src++;
		}
	}
	return dst;
}
int main(){
	char str[100] = "ABCDE";
	int len = strlen(str);
	memcpy(str+1, str , len);
	printf("%s", str);
	system("pause");
	return 0;
}

三、strlen的模拟实现

1.计数器方法:

int Mystrlen(char * str){
	int count = 0;
	while (*str != 0){
		str++;
		count++;
	}
	return count;
}
int main(){
	char a[] = "dadai";
	int aa=Mystrlen(a);
	printf("%d", aa);
	system("pause");
	return 0;
}

2.递归方式:

int Mystrlen(char * str){
	if (*str == '\0'){
		return 0;
	}
	else return (1 + Mystrlen(str + 1));
}//1+1+1+1+1+0
int main(){
	char a[] = "dadai";
	int aa=Mystrlen(a);
	printf("%d", aa);
	system("pause");
	return 0;
}

3.利用指针实现:

int Mystrlen(char * str){
	char *p = str;
	while (*p){
		p++;
	}
	return (p - str);
}

int main(){
	char a[] = "dadai";
	int aa=Mystrlen(a);
	printf("%d", aa);
	system("pause");
	return 0;
}

四、strcpy的模拟实现

将src所指向的内容拷贝到dst所指向的存储单元。

char * Mycpy(char *dst, const char * src){
assert(dst != NULL && src !=NULL);
char *Mycpy = dst;
while((*dst++ = *src++) != '\0');
return Mycpy;
}
int main(){

	char src []= "daadok";
	char dst[10] ;
	Mycpy(dst, src);
	printf("%s", dst);
	system("pause");
	return 0;
}

五、strcmp的模拟实现

strcmp用于比较两个字符串是否相等,若相等则返回0,若dst>src则返回1,否则换回-1.

int Mystrcmp(const char* dst,const char * src){
	while (*dst&&*src&&(*dst == *src)){
		dst++;
		src++;
	}
	if (*dst > *src){
		return 1;
	}
	else if (*dst < *src){
		return -1;
	}
	else if (*dst == *src){
		return 0;
	}
}
int main(){
	char str1[] = "abcdefg";
	char str2[] = "dfd";
	int a=Mystrcmp(str1, str2);;
	printf("%d", a);
	system("pause");
	return 0;
}

六、strstr模拟实现

在dst中找到第一次与src相等的位置并输出这个位置之后dst所指向的内容。

char *mystrstr( const char *dst,const  char *src){
	assert(dst);
	assert(src);
	const char *p = dst;
	while (*p){
		const char *movep = p;
		const char *sp = src;
		while(*movep && *sp&& *sp== *movep){
			sp++;
			movep++;
		}
		if (*sp == '\0'){
			return (char *)p;
		}
		p++;
	}
	return NULL;
}
int main(){
	const char* dst = "abcd123456";
	const char*src = "cd";
	char *ret= mystrstr(dst, src);
	printf("%s", ret);
	system("pause");
	return 0;
}

七、模拟实现strcat

把src所指向的内容拼接到dst所指向内容的末尾。

char * mystrcat(char*dst, const char*src){
	assert(src);
	assert(dst);
	char*ret = dst;
	while (*dst){
		dst++;
	}
	while (*src){
		*dst = *src;
		dst++; src++;
	}
	return ret;
}
int main(){
	char dst[64] = "abcd";
	char *src = "efg";
	mystrcat(dst, src);
	printf("%s", dst);
	system("pause");
	return 0;
}

到此这篇关于C语言实现常用字符串库函数的文章就介绍到这了,更多相关C语言字符串库函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言字符函数与字符串函数详解

    目录 本章重点 前言 1.strlen函数 注意点1 注意点2 2.strcpy 注意点1: 注意点2: 注意点3: 注意点4: 总结 本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 1.求字符串长度 strlen 2.长度不受限制的字符串函数 strcpy ,strcat, strcmp 3.长度受限制的字符串函数 strncpy,strncat ,strncmp 4.字符串查找 strstr,strtok 5.错误信息报告 strerror 6.字符操作 7.内存操作函数 mem

  • C语言字符/字符串相关函数收藏大全

    字符处理函数 int tolower(char ch)若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z') int toupper(char ch)若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z') int _tolower(char ch)返回ch相应的小写字母('a'-'z') int _toupper(char ch)返回ch相应的大写字母('A'-'Z') int toascii(char c)返回c相应的ASCII 举个栗子: #include<s

  • 深入了解C语言字符函数和字符串函数

    目录 前言 求字符串长度 strlen介绍 strlen直接使用: strlen模拟实现: strlen对比sizeof 长度不受限制的字符串函数 strcpy 直接使用 模拟实现: strcat 直接使用: 模拟实现: strcmp 运行结果: 模拟实现: 长度受限制的字符串函数 strncpy strncat strncmp 字符串查找 strstr strtok 字符分类函数 内存操作函数 memcpy memmove memcmp 总结 前言 C语言中对字符串的处理很是繁琐,但是C语言本

  • C语言中求字符串长度的函数的几种实现方法

    1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { assert(str != NULL); int count = 0; while (*str != '\0') { count++; str++; } return count; } 2.不创建计数器,从前向后遍历一遍,没有遇到'\0'就让指针向后加一,找到最后一个字符,记下来地址,然后用最后一个字符的地址减去起始地址,就得到了字符串的长度.

  • 带你用C语言实现strtok和字符串分割函数

    目录 前言 一.strtok的基本使用 二.strtok的实现 总结 前言 字符串分割函数strtok,大家可能都知道他怎么使用,一旦要用的时候就会心生疑惑,不知道它的内部的实现,废话不多说,本篇就来带大家看看strtok的基本使用和实现 一.strtok的基本使用 解析:函数大概说了以下几点 1.str就是我们要去拆分的字符串,注意,我们会对该字符串进行更改,所以一般我们会拷贝一份然后去分割拷贝的那份字符串!! 2.delimiters 就是我们定义的切分的符号,假如想要用空格作为分割符,我们

  • C语言的字符串函数,内存函数笔记详解

    目录 strlen strlen模拟实现 strcpy strcpy的模拟实现 strcat strcat的模拟实现 strcmp strcmp模拟实现 strstr strstr模拟实现 strncpy strncat strncmp strtok memcpy memcpy模拟实现 memmove memmove模拟实现 memcmp 字符分类函数 字符串换函数 总结 strlen 此函数接收一个char*类型参数,返回字符串\0前字符数,注意返回类型是size_t型的 //关于strlen

  • C语言实现常用字符串库函数(推荐)

    目录 一.实现memcpy 二.memmove模拟实现 三.strlen的模拟实现 1.计数器方法: 2.递归方式: 3.利用指针实现: 四.strcpy的模拟实现 五.strcmp的模拟实现 六.strstr模拟实现 七.模拟实现strcat 一.实现memcpy 将src所指向的内容拷贝到dst所指向的位置,拷贝len个字节. memcpy是内存拷贝函数 memcpy在使用的时候不用考虑类型,以字节为单位进行拷贝 遇到"\0"的时候不会停下,所以拷贝字符串的时候最好还是用strcp

  • JS常用字符串方法(推荐)

    JS常用字符串方法(推荐) <SPAN style="FONT-FAMILY: 'courier new', courier">var str01 = "odd open xboxone" , str02 = "hey"; var str03; var num = 15; </SPAN> // 以下省略前半部分的 " str01. " (部分不是这个喔) charAt(num) // 得到指定索引位置的

  • 实现C语言常用字符串库函数

    目录 strlen strcpy strcat strcmp 总结 strlen 数组长度的计算是通过strlen来的,它的作用就是判断给定的数组元素个数,直到碰到\0结束 函数原型 size_t strlen ( const char * str ); 废话少说,直接上代码 int my_strlen(char *str) { char* ch=str; int count=0; while(*ch!='\0') { count++; ch++; } return count; } 但考虑到安

  • C语言中常用的几个头文件及库函数

    不完全统计,C语言标准库中的头文件有15个之多,所以我主要介绍常用的这四个头文件stdio.h,string.h,math.h,stdlib.h,以后用到其他的再做补充.下面上干货: 1.<stdio.h>:定义了输入输出函数.类型以及宏,函数几乎占了标准库的1/3. (1)文件访问. FILE *fopen("filename","mode"): 以mode模式打开地址为'filename'的文件,并返回文件指针. 访问模式主要是"r&quo

  • Go语言常用字符串处理方法实例汇总

    本文实例汇总了Go语言常用字符串处理方法.分享给大家供大家参考.具体如下: 复制代码 代码如下: package main import (     "fmt"     "strings"     //"unicode/utf8" ) func main() {     fmt.Println("查找子串是否在指定的字符串中")     fmt.Println(" Contains 函数的用法")    

  • PHP常用字符串函数小结(推荐)

    一.判断类型的函数 is_bool() //判断是否为布尔型 is_float() //判断是否为浮点型 is_real() //同上 is_int() //判断是否为整型 is_integer() //同上 is_string() //判断是否为字符串 is_object() //判断是否为对象 is_array() //判断是否为数组 is_null() //判断是否为null is_file() //判断是否为文件 is_dir() //判断是否为目录 is_numeric() //判断是

  • C语言详细讲解常用字符串处理函数

    目录 一.strlen() 1. 函数原型: 2. 手动实现: 二.strcat() 1. 函数原型: 2. 手动实现: 三.strcpy() 1. 函数原型: 2. 手动实现: 四.strcmp() 1. 函数原型: 2. 手动实现: 五.memset() 1. 函数原型: 2. 手动实现: 一.strlen() 1. 函数原型: size_t strlen(const char *str) 参数str: 要计算的字符串的长度返回值: 返回字符串 str 的长度,直到遇到结束字符'\0',但不

  • C语言实现将字符串转换为数字的方法

    本文实例讲述了C语言实现将字符串转换为数字的方法.分享给大家供大家参考.具体实现方法如下: C语言提供了几个标准库函数,可以将字符串转换为任意类型(整型.长整型.浮点型等)的数字.以下是用atoi()函数将字符串转换为整数的一个例子: 复制代码 代码如下: # include <stdio. h> # include <stdlib. h> void main (void) ; void main (void) {     int num;     char * str = &qu

  • 常用Eclipse快捷方式(推荐)

    Ctrl+1 快速修复 Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) Alt+↑ 当前行和上面一行交互位置(同上) Alt+← 前一个编辑的页面 Alt+→ 下一个编辑的页面 Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性 Shift+Enter 在当前行的下一行插入空行 Shift+Ctrl+Enter

  • Java中常用的类型转换(推荐)

    1.将字符串转换成整数(String--->int) 方法一: (1) int i = Integer.parseInt(String s); 其中(1)其实就是我们经常用到的将s转换为10进制得数,其实默认是调用了 int i =Integer.parseInt("123",10); (2) i = Integer.parseInt(String s,int radix); radix的范围是在2~36之间,超出范围会抛异常.其中s的长度也不能超出7,否则也会抛异常. 方法二:

随机推荐