strlen、strcpy、strcat、strchr、strcmp、memcpy、memmove

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

#include<stdio.h>
#include<assert.h>
int my_strlen(char *p)
{
	assert(p != NULL);
	int count = 0;
	while (*p)
	{
		count++;
		p++;
	}
	return count;
}
int my_strlen2(char *p)
{
	assert(p != NULL);
	if (*p == '\0')
		return 0;
	else
		return 1 + my_strlen2(p+1);
}
int main()
{
	char *p = "abcdef";//文本区、双引号后面默认加‘\0’{}后面得自己加'\0'
	char p2[] = "abcd";//栈
	printf("%d\n",my_strlen(p2));
	printf("%d\n",my_strlen2(p));
	system("pause");
}

strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*

#include<stdio.h>
#include<assert.h>
char* MY_strcpy(char* dest, const char* src)
{
	char * ret;
	assert(dest&&src);
	ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	/*while (*src)
	{
	*dest = *src;
	dest++;
	src++;
	}*/
	return ret;
}
int main()
{
	char arr[20] = "0";
	char avg[20] = "good job";
	MY_strcpy(arr, avg);
	printf("%s\n", avg);
	printf("%s\n", arr);
	system("pause");
	return 0;
}

strcat把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针

#include<stdio.h>
#include<assert.h>
char* my_strcat(char *dest, const char*src)
{
	char *ret = dest;
	assert(dest);
	assert(src);
	//1. 找目标的'\0'
	while (*dest)
	{
		dest++;
	}
	//2. 源拷贝到目标
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr[20] = "Good";
	char avg[10] = "game!!!";
	my_strcat(arr, avg);
	printf("%s\n", arr);
	system("pause");
	return 0;
} 

strchr是计算机编程语言的一个函数,原型为extern char *strchr(const char *s,char c),可以查找字符串s中首次出现字符c的位置。

#include<stdio.h>
char * my_strchr(char * arr, char ch)
{
	while (*arr != '\0')
	{
		if (*arr == ch)
		{
			return (char *)arr;
		}
		arr++;
	}
	return NULL;
}

int main()
{
	char *arr = "abcde";
	char *ret = my_strchr(arr, 'd');
	printf("%s\n", ret);
	system("pause");
	return 0;
}

matlab中函数,strcmp(s1,s2) 判断两个字符串s1和s2是否相同,相同返回true ,不同返回false。

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char *arr1, const char *arr2)
{
	char *s1 = arr1;
	char *s2 = arr2;
	assert(arr1&&arr2);
	while (*s1 && *s2)
	{
		if (*s1 == *s2)
		{
			s1++;
			s2++;
		}
		else if (*s1 > *s2)
			return 1;
		else
			return -1;
		
	}
	return 0;
}
int main()
{
	char *arr1 = "goodgame";
	char *arr2 = "goodgame";
	char *arr3 = "goodjob";
	int ret1 = my_strcmp(arr1, arr2);
	int ret2 = my_strcmp(arr1, arr3);
	printf("%d\n", ret1);
	printf("%d\n", ret2);
	system("pause");
	return 0;
}
///*字符串比较函数,一般形式为strcmp(字符串1,字符串2)。
//比较规则:
//对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。
//如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
//如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。

memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

//原型:extern void *memcpy(void *dest, void *src, unsigned int count);
//用法:#include <string.h>
//功能:由src所指内存区域复制count个字节到dest所指内存区域。
//说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针
//1、memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制
//拷贝的字节数;
//函数原型:void *memcpy(void *dest, void *src, unsigned int count);
//用法:(1)可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可以是int*,short*,char*等等,
//但是由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为char*,这样在指针加的时候才会保证每次加一个字节
#include<stdio.h>
#include<assert.h>
void *my_memcpy(void *dest, void *arr, size_t size)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(arr != NULL);
	while (size-- )
	{
		*(char *)dest = *(char *)arr;
		++(char *)dest;
		++(char *)arr;
	}
	return ret;
}
int main()
{
	char arr[] = "goodjob!!!";
	char dest[20] = { 0 };
	char *ret =my_memcpy(dest, arr, strlen(arr));//第三个参数是需要拷贝的字节数
	printf("%s\n", ret);
	printf("%d", strlen(arr));
	system("pause");
	return 0;
}

memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

#include<stdio.h>
#include<assert.h>
void* my_memmove(void *dest, const void*src, size_t count)
 {
 	void *ret = dest;
 	assert(dest != NULL);
 	assert(src != NULL);
 	if(dest<src)
 	{
 		//前->后
 		while(count--)
 		{
 			*(char*)dest = *(char*)src;
 			dest = (char*)dest+1;
 			src = (char*)src+1;
 		}
 	}
 	else
 	{
		dest = (char *)dest + count - 1;
		src = (char *)src + count - 1;
 		//后->前
 		while(count--)
 		{
			*(char *)dest = *(char*)src;
			dest = (char *)dest - 1;
			src = (char*)src - 1;
 		}
 	}
 	return ret;
 }
  int main()
  {
	char arr2[] = "123456789";
  	char *ret = (char *)memmove(arr2+3, arr2+2, 4);
	printf("%s\n", ret);
	printf("%s\n", arr2);
	system("pause");
  	return 0;

猜你喜欢

转载自blog.csdn.net/qq_41209741/article/details/82695038
今日推荐