Explication détaillée des fonctions de caractères et des fonctions de chaîne (3) strerror memcpy memmove memset memcmp (et certaines fonctions de classification de caractères)

Catalogue de séries d'articles : Explication détaillée des fonctions de caractères et des fonctions de chaîne (1) Explication détaillée de strcmp
strlen strcpy strcat


Ce numéro présente principalement la fonction d'impression des informations d'erreur et la fonction d'opération de mémoire , et présente brièvement la fonction d'opération de caractères (vous pouvez l'utiliser avec compétence)

1. Rapport de message d'erreur

Utilisation de la fonction strerreur

Le code d'erreur 0 1 2 3 4 est défini dans le langage C et l'effet imprimé est comme indiqué dans l'image suivante : informations sur le code d'erreur
errno est une variable d'erreur globale fournie par le langage C. Lors de son utilisation, le fichier d'en-tête #include <errno .h> doit être inclus. Lorsque nous utilisons une fonction pour signaler une erreur, le code d'erreur correspondant sera attribué à errno . À ce stade, nous pouvons utiliser la fonction strerror pour imprimer le message d'erreur correspondant.
Exemple de code :

#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;
	
}

Résultats d'exécution :
résultat de l'opération
des amis attentifs découvriront que j'ai utilisé perror("fopen:"); dans le code, en fait, la fonction perror est utilisée pour ajouter une description au message d'erreur, qui insérer la description de l'image ici
peut être comprise comme "informations de description+strerror( numéro d'erreur); "

2. Fonction d'opération de mémoire

1.memcpy

void* memcpy ( void* destination, const void* source, size_t num );

(1) Utilisation de memcpy

Nous appelons la fonction memcpy une fonction de copie de mémoire, qui copie directement la valeur de num octets de l'emplacement pointé par source vers le bloc mémoire pointé par destination .
Exemple de code :

#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;
}

insérer la description de l'image ici
insérer la description de l'image ici
Différent de strcpy , memcpy copie en unités de mémoire et n'utilise pas le terminateur \0 comme sa propre marque de fin. En d'autres termes, memcpy n'a pas de marque de fin, il sera donc directement copié dans num avant de terminer.
De plus, memcpy n'est pas utilisé pour copier deux blocs de mémoire qui se chevauchent. La fonction memmove est généralement utilisée pour copier deux blocs de mémoire qui se chevauchent . La fonction suivante présentera ce qu'est le chevauchement de mémoire et comment utiliser memmove.

(2) Implémentation de simulation 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;
}

résultat de l'opération :
insérer la description de l'image ici

2.memmove

void* memmove ( void* destination, const void* source, size_t num );

(1) Utilisation de memmove

memmove est également une fonction de copie de mémoire comme memcpy , mais la différence est que memmove peut gérer la situation de chevauchement de mémoire ; nous présenterons ensuite la situation de chevauchement de mémoire ;
insérer la description de l'image ici
donc lorsqu'il y a un chevauchement de mémoire pendant la copie, la fonction memmove doit être utilisée pour le mettre en œuvre.
Exemple de code :

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

résultat de l'opération :
insérer la description de l'image ici

(2) Implémentation de simulation 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;
}

résultat de l'opération :
insérer la description de l'image ici

3.memset

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

L'utilisation de memset

memset est la fonction d'initialisation du langage C/C++ sur l'ordinateur. La fonction consiste à définir tout le contenu d'un bloc de mémoire à la valeur spécifiée. Cette fonction initialise généralement la mémoire nouvellement demandée. La fonction consiste à remplir une valeur donnée dans un bloc de mémoire, ce qui est le moyen le plus rapide d'effacer une grande structure ou un grand tableau.
Exemple de code :

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

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

résultat de l'opération :insérer la description de l'image ici

4.memcmp

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

Utilisation de memcmp

memcmp est utilisé pour comparer deux blocs de mémoire. Compare l'octet numérique précédent du bloc mémoire pointé par ptr1 avec l'octet numérique précédent pointé par ptr2 et renvoie zéro s'ils correspondent tous les deux, ou une valeur différente de zéro s'ils ne correspondent pas. Indique quelle valeur est la plus grande.

valeur de retour montrer
valeur de retour>0 Le premier octet qui ne correspond pas dans les deux blocs mémoire a une valeur inférieure dans ptr1 que dans ptr2 (s'il est évalué comme une valeur de caractère non signée)
valeur de retour = 0 Les contenus des deux blocs mémoire sont égaux
valeur de retour <0 La valeur du premier octet de ptr1 qui ne correspond pas dans les deux blocs de mémoire est supérieure à la valeur de ptr2 (si elle est évaluée comme une valeur de caractère non signée)
Exemple de code :
#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;
}

résultat de l'opération :
insérer la description de l'image ici

3. Fonctions des personnages

Lorsque vous utilisez des fonctions de caractères, vous devez inclure "#include <ctype.h>"

1. Fonction de classification des personnages

La photo provient de Xi'an Bit Technology Education Co., Ltd.

2. Fonction de conversion de caractères

int tolow ( int c );
int topper ( int c );

Exemple de code :

#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;
}

Remarque : peu importe à quel point vous travaillez dur, vous serez aussi spécial que possible.

Je suppose que tu aimes

Origine blog.csdn.net/qq_64293926/article/details/127059868
conseillé
Classement