Detaillierte Erläuterung der C/C++-Zeichenfunktionen und Zeichenfolgenfunktionen – Detaillierte Erläuterung und Simulation von Speicherfunktionen

Persönliche Homepage : Klicken Sie auf mich, um zur Homepage zu gelangen

Spaltenklassifizierung: C-Sprache, elementare       C-Sprachprogrammierung – KTV        C-Sprach-Minispiel,      C-Sprache für Fortgeschrittene

Fragen zum C-Sprachtest

Jeder ist willkommen zum Liken, Kommentieren und Sammeln.

Arbeiten Sie hart zusammen und gehen Sie gemeinsam in eine große Fabrik.

Inhaltsverzeichnis

1. Einleitung

2. Memcpy-Funktion

3.Memmove-Funktion

4.Memset-Funktion

 5.memcmp-Funktion


1. Einleitung

           Wir haben zuvor etwas über String-Funktionen mit begrenzter Länge und String-Funktionen mit unbegrenzter Länge gelernt. Unter diesen entspricht strcmp der Funktion strncmp, die Funktion strcpy entspricht der Funktion strncpy und die Funktion strcat entspricht der Funktion strncat. Heute verstehen wir hauptsächlich die vier Speicherfunktionen. Dies sind die Memcpy-Funktion, die Memmove-Funktion, die Memset-Funktion und die Memcmp-Funktion. Die Funktionen der Memcpy-Funktion und der Strcpy-Funktion sind ähnlich, und die Memcmp-Funktion ähnelt der Strcmp-Funktion. Lassen Sie uns als Nächstes den Charme dieser Funktionen spüren.

2. Memcpy-Funktion

        Viele Menschen sind zum ersten Mal mit der Memcpy-Funktion konfrontiert. Wir gehen auf die Cplusplus-Website cplusplus , um die Parameter der Memcpy-Funktion anzuzeigen.

        Wir sehen, dass die Parameter der Funktion void * Ziel, const void * Quelle, size_t num sind. Für die Parameter müssen wir wissen, welche Funktion diese Funktion hat. Sie kopiert hauptsächlich alle Arten von Daten, daher sind Ziel und Quelle beide void *-Typ, da der void*-Typ jeden Zeigertyp enthalten kann, wobei „destination“ der Zeiger auf das Ziel, „source“ der Zeiger auf die Quelle und „num“ die Anzahl der Bytes ist, die Sie kopieren möchten. Als nächstes folgt die Codedemonstration wie folgt:

#include<stdio.h>
#include <string.h>
int main()
{
	int arr1[10] = { 0 };
	int arr2[5] = { 2,3,4,5,6 };
	memcpy(arr1, arr2, 20);
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

 Wenn wir den Code ausführen, sind die Ergebnisse wie folgt:

Als nächstes simulieren Sie die Funktion

#include<stdio.h>
#include <string.h>
void* my_memcpy(void* str1, const void* str2, size_t num)
{
	char* p = (char*)str1;
	while (num--)
	{
		*(char*)str1 = *(char*)str2;
		str1 = (char*)str1 + 1;
		str2 = (char*)str2 + 1;
	}
	return p;
}
int main()
{
	int arr1[10] = { 0 };
	int arr2[5] = { 2,3,4,5,6 };
	my_memcpy(arr1, arr2, 20);
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

        Hier müssen wir eine erzwungene Konvertierung durchführen, in den Typ char* konvertieren und ihn dann Byte für Byte ändern, aber diese Funktion unterliegt bestimmten Einschränkungen. Wenn der Zielzeiger und der Quellzeiger auf dieselben Daten zeigen und es eine Überlappung gibt, wird die Funktion ausgeführt andere Ergebnisse als erwartet. Wir können es einfach zeichnen:

Wenn wir str1 nach str2 kopieren möchten und die ersten drei Daten kopieren, stimmt str1 mit dem ursprünglichen str2 überein

         Wenn Sie es erneut ändern möchten, werden doppelte Kopien erstellt. Gemäß der Standard-Memcpy-Funktion der C-Sprache werden Daten aus verschiedenen Quellen kopiert. Für Daten aus demselben Array ist jedoch eine andere Funktion erforderlich. Diese Funktion ist memmove Funktion. Als nächstes stellen wir die Funktion memmove. vor.

3.Memmove-Funktion

        Wir besuchen auch die Website von cplusplus, um die Parameter und Funktionen der memmove-Funktion anzuzeigen.

           Wir sehen, dass die Parameter der Funktion void * Destination, const void * source, size_t num sind. Die Funktion der memmove-Funktion ähnelt der Funktion der memcpy-Funktion, außer dass memmove Daten aus demselben Array kopiert. Sowohl Ziel als auch source sind vom Typ void*. , da der Typ void* jeden Zeigertyp enthalten kann, wobei „destination“ der Zeiger auf das Ziel, „source“ der Zeiger auf die Quelle und „num“ die Anzahl der Bytes ist, die Sie kopieren möchten. Als Nächstes: Die Codedemonstration lautet wie folgt:

#include <stdio.h>
#include <string.h>
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9};
	memmove(arr, arr + 3, 20);
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;

}

Die Laufergebnisse sind wie folgt:

Als nächstes führen wir die Simulationsimplementierung der memmove-Funktion durch. Der Code lautet wie folgt:

#include <stdio.h>
#include <string.h>
#include <assert.h>
void my_memmove(void* str1, const void* str2, size_t sz)
{
	assert(str1 && str2);
	if (str1 < str2)
	{
		while (sz--)
		{
			*(char*)str1 = *(char*)str2;
			str1 = (char*)str1 + 1;
			str2 = (char*)str2 + 1;
		}
	}
	else
	{
		while (sz--)
		{
			*((char*)str1 + sz) = *((char*)str2 + sz);
		}
	}
}
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	my_memmove(arr+3, arr , 20);
	int i;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;

}

 Hier müssen wir uns zwei Situationen ansehen: Die erste ist str1 vor str2

In diesem Fall müssen wir nur Werte von vorne nach hinten zuweisen. Für die zweite Art

 Wir können str1 nicht von vorne nach hinten nach str2 kopieren, da es sonst zu wiederholten Zuweisungen und Fehlern kommt. In diesem Fall müssen wir nur Werte von hinten nach vorne zuweisen, um das Problem zu lösen.

4.Memset-Funktion

         Gehen wir zur Überprüfung auf die cplusplus-Website

        Die Memset-Funktion ist eine Funktion, die Daten initialisiert. Diese Daten können von jedem Typ sein, aber Zeichenfolgen sind besser geeignet. PTR zeigt auf den Ort, den Sie ändern möchten, Wert bezieht sich auf den Wert, den Sie ändern möchten, und Num bezieht sich auf die Anzahl Zu ändernde Bytes. Wir geben den Code direkt ein. Der Code lautet wie folgt:

#include <stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdefg";
	memset(arr, 'x', 4);
	printf("%s", arr);
	return 0;
}

Die Laufergebnisse sind wie folgt:

Geben Sie als Nächstes unsere Simulationsimplementierung ein. Der Code lautet wie folgt:

#include <stdio.h>
#include<string.h>
#include <assert.h>
void* my_memset(void* str, int vaul, size_t sz)
{
	assert(str);
	char* p = (char*)str;
	while (sz--)
	{
		*(char*)str = vaul;
		str = (char*)str + 1;
	}
	return p;
}
int main()
{
	char arr[] = "abcdefg";
	my_memset(arr, 'x', 4);
	printf("%s", arr);
	return 0;
}

 5.memcmp-Funktion

        Wir rufen die Cplusplus-Website auf, um die Parameter der Funktion anzuzeigen 

        Die Funktion der memcmp-Funktion besteht darin, die Datengröße zu vergleichen, wobei num die Anzahl der zu vergleichenden Datenbytes ist. Die Funktion ähnelt strncmp. Gehen wir direkt zum Code:

 

#include <stdio.h>
#include <string.h>
int main()
{
	int arr[5] = { 0,1,2,3,4 };
	int arr1[5] = { 0 };
	int ret = memcmp(arr, arr1, 5);
	printf("%d", ret);
	return 0;
}

Wir können es verstehen als 

Die ersten 4 Bytes sind gleich und das fünfte Byte str1 ist größer als str2, daher wird 1 zurückgegeben. Die laufenden Ergebnisse sind wie folgt;

 

Simulieren Sie als Nächstes die Implementierung der memcmp-Funktion. Der Code lautet wie folgt:

#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_memcmp(const void* str1, const void* str2, size_t sz)
{
	assert(str1 && str2);
	int i;
	for (i = 0; i < sz; i++)
	{
		if (*(char*)str1 >*(char*)str2)
		{
			return 1;
		}
		else if (*(char*)str1 < *(char*)str2)
		{
			return -1;
		}
		str1 = (char*)str1 + 1;
		str2 = (char*)str2 + 1;
	}
	return 0;
}
int main()
{
	int arr[5] = { 0,1,2,3,4 };
	int arr1[5] = { 0 };
	int ret = my_memcmp(arr, arr1, 5);
	printf("%d", ret);
	return 0;
}

Das ist das Ende des heutigen Inhalts. Ich hoffe, Sie können etwas lernen.

Supongo que te gusta

Origin blog.csdn.net/Infernal_Puppet/article/details/133560166
Recomendado
Clasificación