Resumen de aprendizaje de lenguaje C _08_ implementación de simulación de función de biblioteca

1. Realización simulada de strlen (longitud efectiva de la cadena):
Hay tres formas:
1. Calculadora:

size_t my_strlen_1(const char* str)
{
    
    
	int count = 0;
	while (*str)
	{
    
    
		count++;
		str++;	
	}
	return count;
}

2. Implementación recursiva

//递归
size_t my_strlen_2(const char * str)
{
    
    
	if (*str == '\0'){
    
    
		return 0;
	}
	else{
    
    
		return 1 + my_strlen_2(str + 1);
	}
}

3. Puntero menos puntero

//指针-指针的方式
size_t my_strlen_3(const char *str)
{
    
    
	const char *p = str;
	while (*p){
    
    
		p++;
	}
	return p - str;
}

En segundo lugar, simule la realización de una copia de cadena (strcpy)

char *my_strcpy(char *dest, const char* src)
{
    
    
	assert(dest && src);
	char *ret = dest;
	while (*dest = *src){
    
    
		dest++;
		src++;
	}
	return ret;
}

3. Para simular la cadena que agrega strcat,
solo necesita mover el puntero dest al final y la lógica restante es la misma que strcpy

/*
  三、模拟实现strcat
*/
char *my_strcat(char* dest, const char* src){
    
    
	assert(dest&&src);
	char *ret = dest;
	while (*dest){
    
    
		dest++;
	}
	while (*dest = *src){
    
    
		dest++;
		src++;
	}
	return ret;
}

Cuatro, simular strcmp

/*
  模拟实现strcmp
*/
int my_strcmp(const char * src, const char *dest){
    
    
	int ret = 0;
	assert(src != NULL);
	assert(dest != NULL);
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest)
	{
    
    
		src++;
		dest++;
	}
	if (ret > 0){
    
    
		return 1;
	}
	if (ret < 0){
    
    
		return -1;
	}
	return ret;

}

Cinco, simula memcpy

/* 
   模拟实现memcpy
*/
void * my_memcpy(void * dst, const void *src, size_t num)
{
    
    
	assert(dst && src);
	char *_dst = (char *)dst;
	char *_src = (const char*)src;
	while (num){
    
    
		*_dst = *_src;
		_src++;
		_dst++;
		num--;
	}
}

Pero memcpy no puede manejar la copia de la superposición de memoria.
A través del análisis del dibujo, la copia de la cadena se puede dividir en dos partes, desde la dirección baja 3 hasta la dirección alta. En este momento, la lógica de la memcpy anterior ya no cumplirá los requisitos, por lo que es necesario simular la implementación de memmove. En la versión anterior del compilador, memmove puede manejar la superposición de memoria, pero memcpy no. Memcopy está optimizado en el compilador más nuevo, y ahora las dos funciones son iguales.
Seis, la realización de la simulación de memmove

/*
   模拟实现memmove
*/
void * my_memmove(void * dst, const void *src, size_t num)
{
    
    
	assert(dst && src);
	char *_dst = (char *)dst;
	char *_src = (const char*)src;

	if (_dst > _src && _dst < _src + num)
	{
    
    
		//从右往左拷贝
		_dst = _dst + num - 1;
		_src = _src + num - 1;
		while (num){
    
    
			*_dst = *_src;
			_src--;
			_dst--;
			num--;
		}
	}
	else{
    
    
		//从左向右拷贝
		while (num){
    
    
			*_dst = *_src;
			_src++;
			_dst++;
			num--;
		}

	}
	return dst;
}

Supongo que te gusta

Origin blog.csdn.net/CZHLNN/article/details/109895200
Recomendado
Clasificación