Explicación detallada de las funciones de caracteres y funciones de cadena (3) strerror memcpy memmove memset memcmp (y algunas funciones de clasificación de caracteres)

Catálogo de series de artículos: Explicación detallada de funciones de caracteres y funciones de cadena (1) Explicación detallada de strcmp
strlen strcpy strcat


Este número presenta principalmente la función de impresión de información de error y la función de operación de memoria , y presenta brevemente la función de operación de caracteres (puede usarla con soltura)

1. Informe de mensaje de error

Uso de la función strerror

El código de error 0 1 2 3 4 está definido en el lenguaje C y el efecto impreso es como se muestra en la siguiente imagen: información del código de error
errno es una variable de error global proporcionada por el lenguaje C. Al usarlo, el archivo de encabezado #include <errno .h> debe incluirse. Cuando usamos una función para informar un error, el código de error correspondiente se asignará a errno . En este momento, podemos usar la función strerror para imprimir el mensaje de error correspondiente.
Ejemplo de código:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<String.h>
#include <errno.h>
int main()
{
    
    

	FILE* pf = fopen("test.txt", "r");
	
		if (pf == NULL)
		{
    
    
			perror("fopen:");   //稍后再说
			printf("%s\n", strerror(errno));//打印的是errno变量中错误码对应的错误信息
			return 1;
		}	
		//读文件
		fclose(pf);
		pf = NULL;
		return 0;
	
}

Resultados de la ejecución:
resultado de la operación
los amigos cuidadosos encontrarán que usé perror ("fopen:"); en el código, de hecho, la función perror se usa para agregar una descripción al mensaje de error, que inserte la descripción de la imagen aquí
puede entenderse como "información de descripción + strerror ( errno); "

2. Función de operación de memoria

1.memcpy

void* memcpy ( void* destino, const void* fuente, size_t num);

(1) Uso de memcpy

Llamamos a la función memcpy una función de copia de memoria, que copia directamente el valor de num bytes desde la ubicación señalada por el origen al bloque de memoria señalado por el destino .
Ejemplo de código:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>

int main()
{
    
    
	int destination[10] = {
    
     0 };
	int source[10] = {
    
     1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	memcpy(destination, source, 8);

	//float arr1[] = { 1.0f,2.0f,3.0f,4.0f };
	//float arr2[5] = { 0.0 };
	//memcpy(arr2, arr1, 8);

	return 0;
}

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
A diferencia de strcpy , memcpy copia en unidades de memoria y no utiliza el terminador \0 como su propia marca final. En otras palabras, memcpy no tiene marca final, por lo que se copiará directamente a num antes de finalizar.
Además, memcpy no se usa para copiar dos bloques de memoria superpuestos. La función memmove se usa generalmente para copiar dos bloques de memoria superpuestos . La siguiente función presentará qué es la superposición de memoria y cómo usar memmove.

(2) Implementación de simulación de memcpy

void* My_memcpy(void* destination,const void* source, size_t num)
{
    
    
	assert(destination);
	assert(source);
	void* ret = destination;
	while (num--)
	{
    
    
		* ((char*)destination)++ = *((char*)source)++;
	}
	return ret;
}
int main()
{
    
    
	char arr[18] = "0000000000000000";
	char arr1[] = "abcdefg sd  a da  s da";
	printf("%s",My_memcpy(arr,arr1,6));
	return 0;
}

resultado de la operación:
inserte la descripción de la imagen aquí

2.memmover

void* memmove ( void* destino, const void* fuente, size_t num);

(1) Uso de memmove

memmove también es una función de copia de memoria como memcpy , pero la diferencia es que memmove puede manejar la situación de superposición de memoria ; a continuación, introduciremos la situación de superposición de memoria;
inserte la descripción de la imagen aquí
por lo que cuando hay superposición de memoria durante la copia, se debe usar la función memmove para implementarlo.
Ejemplo de código:

#include<stdio.h>
#include<string.h>
int main()
{
    
    
	char arr1[] = "11223344556677";
	printf("%s", memmove(arr1, arr1+2, 6));
	return 0;
}

resultado de la operación:
inserte la descripción de la imagen aquí

(2) Implementación de simulación de memmove

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>
#include<assert.h>

void* My_memmove(void* destination,const void* source,size_t num)
{
    
    
	assert(destination);
	assert(source);
	void* ret = destination;
	if (destination <= source)
	{
    
    
		while (num--)
		{
    
    
			*((char*)destination)++ = *((char*)source)++;
		}
	}
	else
	{
    
    

		while (num--)
		{
    
    
			char* des = (char*)destination + num - 1;
			char* sou = (char*)source + num - 1;
			*(des) = *(sou);
		}
	}


	return (char*)ret;
}


int main()
{
    
    
	char arr1[] = "11223344556677";
	printf("%s", My_memmove(arr1, arr1+2, 6));
	return 0;
}

resultado de la operación:
inserte la descripción de la imagen aquí

3.memset

void* memset ( void* ptr, valor int , size_t num);

El uso de memset

memset es la función de inicialización del lenguaje C/C++ en la computadora. La función es establecer todo el contenido de un bloque de memoria en el valor especificado. Esta función generalmente inicializa la memoria recién solicitada. La función es llenar un valor dado en un bloque de memoria, que es la forma más rápida de borrar una estructura o matriz grande.
Ejemplo de código:

#include <stdio.h>
#include <string.h>

int main ()
{
    
    
  char str[] = "abcdefg";
  memset (str,'-',6);
  puts (str);
  return 0;
}

resultado de la operación:inserte la descripción de la imagen aquí

4.memcmp

void* memcmp ( const void* ptr1, const void* ptr2, size_t num );

Uso de memcmp

memcmp se utiliza para comparar dos bloques de memoria. Compara el byte numérico anterior del bloque de memoria al que apunta ptr1 con el byte numérico anterior al que apunta ptr2 y devuelve cero si ambos coinciden, o un valor diferente de cero si no coinciden. Indica qué valor es mayor.

valor de retorno espectáculo
valor de retorno>0 El primer byte que no coincide en los dos bloques de memoria tiene un valor menor en ptr1 que en ptr2 (si se evalúa como un valor de carácter sin signo)
valor de retorno = 0 El contenido de los dos bloques de memoria es igual.
valor de retorno <0 El valor del primer byte en ptr1 que no coincide en ambos bloques de memoria es mayor que el valor en ptr2 (si se evalúa como un valor de carácter sin signo)
Ejemplo de código:
#include <stdio.h>
#include <string.h>
int main ()
{
    
    
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";
  int n;
  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
  
  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

  return 0;
}

resultado de la operación:
inserte la descripción de la imagen aquí

3. Funciones de los personajes

Cuando utilice funciones de caracteres, debe incluir "#include <ctype.h>"

1. Función de clasificación de personajes

La imagen proviene de Xi'an Bit Technology Education Co., Ltd.

2. Función de conversión de caracteres

int tolower ( int c );
int topper ( int c );

Ejemplo de código:

#include <stdio.h>
#include <ctype.h>
int main()
{
    
    
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
    
    
		c = str[i];
		if (isupper(c))
			c = tolower(c);
		putchar(c);
		i++;
	}
	return 0;
}

Nota: No importa lo duro que trabajes, serás lo más especial posible.

Supongo que te gusta

Origin blog.csdn.net/qq_64293926/article/details/127059868
Recomendado
Clasificación