Implémentation de simulation de fonctions de caractères et de fonctions de chaîne C/C++ et explication détaillée——Fonction de chaîne de longueur illimitée

Page d'accueil personnelle : Cliquez sur moi pour accéder à la page d'accueil

Classification des colonnes : Langage C élémentaire       Programmation en langage C——KTV        Mini-jeu en      langage C Langage C avancé

Questions du test de langue C

Tout le monde est invité à aimer, commenter et collectionner.

Travaillez dur ensemble et allez ensemble dans une grande usine.

Table des matières

 

1. Introduction 

Fonction 2strlen 

 Fonction 3.strcpy

4. fonction strcat

Fonction 5.strcmp


 

1. Introduction 

        Pour la partie chaîne, la plupart de ce à quoi nous pensons est la création de chaînes, de chaînes modifiées const, de pointeurs vers des chaînes, de pointeurs de caractères, de tableaux de caractères, etc. En fait, il existe des fonctions de caractères et des fonctions de chaîne dans le langage C. Les caractères et les chaînes sont fréquemment traités en langage C, mais le langage C lui-même n'a pas de type chaîne. Les chaînes sont généralement placées dans des chaînes constantes ou des tableaux de caractères. Les constantes chaîne conviennent aux fonctions chaîne qui ne les modifient pas.

Fonction 2strlen 

        Pour la fonction strlen, nous pouvons visiter le site Web cplusplus cplusplus pour vérifier et voir quels sont les paramètres de la fonction strlen et à quoi ressemble le type de retour.b1d95859afe043a19e799ff492d654ef.png

         Nous voyons que le type de retour de la fonction strlen est le type size_t, qui est un entier non signé, et son type est const char*str, qui est l'adresse de la chaîne. En parlant de cela, avez-vous pensé à notre précédente question de test écrite , pourquoi mettons-nous des caractères dans les paramètres ? L'élément signalera une erreur car l'adresse du caractère doit être placée ici. Puisque la chaîne est stockée dans du code ASCLL, le binaire est converti en hexadécimal et l'entier est promu, ce qui formera un pointeur sauvage et générera une erreur. Cette fonction compte le nombre de caractères qui se terminent par '\0' et ne compte pas '\0' ; par exemple, si nous voulons calculer la longueur d'une certaine chaîne, le code est le suivant :

#include<stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcdef";
	size_t sz = strlen(arr);
	printf("%d\n", sz);
	return 0;
}

Les résultats en cours d'exécution sont les suivants :

1ee0e2a3a2314fb198b5f20660abb35e.png

Nous pouvons simuler et implémenter un code de fonction strlen comme suit :

#include<stdio.h>
int my_strlen(const char* str)
{
	const char* p = str;
	while (*p != '\0')
	{
		p++;
	}
	return p - str;
}
int main()
{
	char arr[] = "abcdef";
	int ret = my_strlen(arr);
	printf("%d", ret);
	return 0;
}

        Ici on utilise principalement des pointeurs moins des pointeurs pour calculer le nombre de caractères. Bien entendu, on peut aussi opérer via des compteurs ou de la récursion, ce qui ne sera pas expliqué en détail ici.


 Fonction 3.strcpy

        Allons sur le site cplusplus pour vérifier les paramètres de strcpy.

8afb6c22cee546d6b774e1aaa0899a5a.png

         On peut voir que le type de retour de la fonction strcpy est char* et les paramètres sont char * destination, const char * source

Le premier paramètre est le pointeur de la chaîne que vous souhaitez modifier, et le deuxième paramètre est le pointeur du caractère que vous souhaitez obtenir. Puisque le deuxième paramètre n'a pas besoin d'être modifié par nous, des erreurs se produiront inévitablement, utilisez donc const pour le modifier. Portez une attention particulière au fait que nous devons nous assurer que la longueur de la chaîne source doit être supérieure à la longueur de la deuxième chaîne, sinon cela provoquerait un problème de débordement de pile et provoquerait le crash du programme. Par exemple, nous pouvons écrire un programme pour expérimenter le fonctionnement de cette fonction. Le code est le suivant :

#include<stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcdef";
	char arr1[] = "aaa";
	strcpy(arr, arr1);
	printf("%s\n", arr);
	return 0;
}

Les résultats en cours d'exécution sont les suivants :

3d08e896f8944990a3cedee949f9419f.png

On simule la fonction strcpy, le code est le suivant :

#include<stdio.h>
#include<assert.h>
void my_strcpy(char* str1, const char* str2)
{
	assert(str1 && str2);
	char* p = str1;
	while (*str2 != '\0')
	{
		*p = *str2;
		p++;
		str2++;
	}
}
int main()
{

	char arr[20] = { 'a','b','c'};
	const char arr2[] = "ba";
	my_strcpy(arr, arr2);
	printf("%s", arr);
}

        Dans cette fonction, nous enregistrons d'abord l'adresse du premier élément de la chaîne, puis définissons le pointeur pour l'affectation, jusqu'à ce que l'affectation '\0' soit terminée, et renvoyons le pointeur du premier élément.

4. fonction strcat

         Nous entrons sur le site Web cplusplus pour vérifier les paramètres de strcat

6a30913a45e54920be3f05ab0cc8939c.png

        Le type de retour de cette fonction est char* et les paramètres sont char * destination, const char * source. Comme la fonction strcpy, son premier paramètre est le pointeur de la chaîne que vous souhaitez modifier et le deuxième paramètre est le caractère que vous que nous voulons obtenir. Puisque le deuxième paramètre ne nous oblige pas à modifier le pointeur, des erreurs se produiront inévitablement, utilisez donc const pour le modifier. Nous voulons concaténer des chaînes, le code est le suivant

#include<stdio.h>
#include <string.h>
int main()
{
	char arr[100] = { 'a','b'};
	char arr1[] = "aaa";
	strcat(arr, arr1);
	printf("%s\n", arr);
	return 0;
}

Les résultats en cours d'exécution sont les suivants :

1b652a2673864f9fa794f6593698e778.png

On simule la fonction strcat, le code est le suivant :

#include<stdio.h>
#include<assert.h>
void my_strcat(char* str1, const char* str2)
{
	assert(str1 && str2);
	char* p = str1;
	while (*p != '\0')
	{
		p++;
	}
	while (*str2 != '\0')
	{
		*p = *str2;
		p++;
		str2++;
	}
	*p = *str2;
}
int main()
{
	char arr[20] = { 'a','b','d','e','f' };
	const char arr2[] = "ghi";
	my_strcat(arr, arr2);
	printf("%s", arr);
	return 0;
}

        Ici, nous avons juste besoin d'un pointeur pour enregistrer la position de la chaîne et la déplacer jusqu'à ce que '\0' apparaisse puis la modifier. Notez que la longueur totale des deux chaînes doit être inférieure à la capacité de la première chaîne.

Fonction 5.strcmp

69253ccff649474a92abf69e2c7a252f.png

        Le type de retour de cette fonction est int. Puisque deux chaînes sont comparées, il n'est pas nécessaire de modifier la chaîne, elle est donc modifiée avec const.

9586c1451a804d05a2047a89f85b4b5a.png

        Sa valeur de retour est un entier. Si la première chaîne est supérieure à la deuxième chaîne, elle renvoie un nombre supérieur à 0. Si elle est inférieure à la deuxième chaîne, elle renvoie un nombre inférieur à 0. S'il lui est égal, il renvoie 0. La comparaison consiste à comparer un par un en commençant par le premier. S'ils sont identiques, revenez en arrière et comparez. S'ils sont différents, comparez et renvoyez le résultat. Par exemple le code :

#include<stdio.h>
#include <string.h>
int main()
{
	const char arr[] = "abcdefg";
	const char arr2[] = "abcdf";
	int ret = strcmp(arr, arr2);
	if (ret > 0)
	{
		printf(">");
	}
	else if (ret < 0)
	{
		printf("<");
	}
	else
	{
		printf("=");
	}
	return 0;
}

Les résultats en cours d'exécution sont les suivants :

cc359757c2e24ffe95312cc566039cb2.png

Nous simulons et implémentons strcmp, le code est le suivant : 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1&& str2);
	while (*str1 == *str2)
	{
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	const char arr[] = "abcdefg";
	const char arr2[] = "abcdf";
	int ret = my_strcmp(arr, arr2);
	if (ret > 0)
	{
		printf(">");
	}
	else if (ret < 0)
	{
		printf("<");
	}
	else
	{
		printf("=");
	}
	return 0;
}

Comme décrit ci-dessus, trouvez d’abord différents caractères, soustrayez-les, puis jugez.

C'est la fin du contenu d'aujourd'hui, j'espère que vous pourrez vous connecter trois fois en un seul clic.

 

Je suppose que tu aimes

Origine blog.csdn.net/Infernal_Puppet/article/details/133346000
conseillé
Classement