Häufig verwendete Zeichenfolgenfunktionen in der Sprache C - was genau befindet sich in der Header-Datei <string.h>?

1. strlen - Finden Sie die Länge einer Zeichenfolge

1.1 Deklaration und Verwendung von strlen

strlen, wenn wir etwas grundlegendes Englisch haben, ist es nicht schwer zu wissen, wofür diese Funktion durch die wörtliche Bedeutung verwendet wird, str bedeutet Zeichenfolge, die Bedeutung von Zeichenfolge, len bedeutet Länge, die Bedeutung von Länge. Das heißt, strlen ist eine Funktion, die die Länge eines Strings ermittelt . Wir verwenden die cplusplus- Website, um die Funktionsdeklaration von strlen und die Bedeutung der einzelnen Parameter zu beachten.

Wir können wissen, dass die von strlen benötigte Länge des Strings die Anzahl der Zeichen vor dem Ende des Strings ist . Das heißt, wir gehen davon aus, dass es einen String "hello world" gibt, dann ist die erforderliche Stringlänge die Anzahl aller Zeichen vor '\0', also 11. Dann wird die Länge dieses Strings durch den Rückgabewert zurückgegeben , also müssen wir eine Variable definieren, um den Rückgabewert zu erhalten, wenn wir wissen wollen, wie lang der String ist . Dann ist der Parameterteil natürlich die erste Adresse des Strings .

1.2 Verwendung von strlen

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

int main()
{
	char str1[] = "hello world";
	char* str2 = "hello world";

	int len1 = strlen(str1);//数组名表首元素地址
	int len2 = strlen(str2);//str2 指针变量存放的也是首元素地址

	printf("%d\n", len1);
	printf("%d\n", len2);

	//这种写法也可以输出长度
	//printf("%d\n", strlen(str1));
	//printf("%d\n", strlen(str2));

	return 0;
}

Zu beachten ist, dass der Rückgabewert von strlen vom Typ size_t ist, was eine Ganzzahl ohne Vorzeichen ist. Seine Bedeutung ist, dass es unmöglich ist, negative Zahlen zu finden, wenn die Länge ermittelt wird, sodass der Speicher bis zu einem gewissen Grad optimiert wird (durch die Verwendung von vorzeichenbehafteten Ganzzahlen wird der Speicherplatz verschwendet, der zum Speichern negativer Zahlen verwendet wird).

 1.3 Simulationsimplementierung von strlen

Wir haben das Prinzip von strlen oben analysiert, also verwenden wir jetzt, was wir gelernt haben, um eine eigene strlen-Funktion zu " erzeugen ".

#include <stdio.h>
#include <assert.h>
unsigned int my_strlen(const char* str)//我们不改变字符串的内容,所以用 const 来进行修饰
{
	assert(str);//避免是一个空指针
	unsigned int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char str1[] = "hello world";
	char* str2 = "hello world";

	int ret1 = my_strlen(str1);
	int ret2 = my_strlen(str2);

	printf("%d\n", ret1);
	printf("%d\n", ret2);

	return 0;
}

2. strcpy - Zeichenfolge kopieren

2.1 Deklaration und Verwendung von strcpy

Wir verstehen seine wörtliche Übersetzung, str table string, dh string, cpy table copy, dh copy. Das heißt, die Funktion strcpy wird zum Kopieren von Zeichenfolgen verwendet . Dann verwenden wir die cplusplus- Website, um die Deklaration von strcpy und die Bedeutung der einzelnen Parameter zu beachten.

 

Wir können es übersetzen, um die Funktion von strcpy zu kennen, den String, auf den der Quellzeiger zeigt, in das Array kopieren, auf das der Zielzeiger zeigt, und der kopierte Inhalt enthält den String-Terminator . Und das Array, auf das der Zielzeiger zeigt, muss genügend Platz haben , um den Inhalt nach dem Kopieren aufzunehmen. 

Daraus wissen wir, dass strcpy zwei Parameter benötigt , einer ist ein Array und der andere ein String. Und der Platz des Arrays muss groß genug sein. Der Rückgabewert ist die Adresse, bevor das zurückgegebene Array kopiert wurde . Damit soll verhindert werden, dass der Inhalt vor der Kopie verloren geht.

2.2 Verwendung von strcpy

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

int main()
{
	char dest[20] = "row your boat";
	char src[] = "hello world";
	strcpy(dest, src);
	printf("%s\n", dest);
	return 0;
}

Dies ist die häufigste Verwendung von strcpy, wir müssen uns nur eines merken: Der kopierte Inhalt enthält '\0' . Das heißt, auch wenn die Länge des von mir kopierten Strings nicht so lang ist wie der ursprüngliche String des Arrays, ich aber '\0' einfüge, ist aus Sicht der C-Sprache der Inhalt nach '\0' nicht von Anfang an gezählt der Inhalt der Zeichenkette .

2.3 Simulationsimplementierung von strcpy

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

char* my_strcpy(char* dest, const char* src)//dest 指向的数组空间是要被改变的,但是 src 指向的字符串不需要改变
{
	assert(dest && src);//防止其中某个是无效指针
	char* ret = dest;
	while (*dest++ = *src++)
		;	//注意 while 循环执行了空语句

	return ret;
}
int main()
{
	char dest[30] = "gently down the stream";
	char src[] = "life is but a dream";

	my_strcpy(dest, src);
	printf("%s\n", dest);
	return 0;
}

3. strcmp - Zeichenfolgenvergleich

3.1 Deklaration und Verwendung von strcmp

Dasselbe gilt, wir können ungefähr verstehen, wofür diese Funktion durch wörtliche Übersetzung verwendet wird. str table string, also string, cmp table Compare, also Vergleich . Wir beachten auch die Deklaration dieser Funktion und die Bedeutung jedes Parameters durch die cplusplus- Website.

Wir können das Prinzip dieser Funktion erkennen, indem wir sie übersetzen. Das Prinzip ist: Der Vergleich beginnt mit dem ersten Zeichen der beiden Zeichenfolgen.Wenn die beiden Zeichen gleich sind, vergleichen die beiden Zeichenfolgen das nächste Zeichenpaar, bis die beiden Zeichen nicht gleich sind, und vergleichen dann Größe . Gibt eine ganze Zahl kleiner als 0 zurück, wenn das erste Zeichen kleiner als das zweite ist, 0, wenn es gleich ist, und eine ganze Zahl größer als 0, wenn es größer ist .

Beide Argumente sind zu vergleichende Zeichenfolgen. Um das Verständnis zu erleichtern, verstehen wir es in Form von Zeichnung .

 

 

 3.2 Verwendung von strcmp

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

int main()
{
	char* str1 = "abbbcd";
	char* str2 = "abbbdd";
	int ret = strcmp(str1, str2);
	if (ret > 0)
		printf("str1 > str2\n");
	else if (ret < 0)
		printf("str1 < str2\n");
	else
		printf("str1 == str2\n");
	return 0;
}

 3.3 Simulationsimplementierung von strcmp

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

int my_strcmp(const char* str1, const char* str2)//两个字符串的内容都不需要修改,用 const 修饰
{
	assert(str1 && str2);//防止是无效指针

	while (*str1 == *str2)//如果相等则进入循环
	{
		if (*str1 == '\0')//*str1 == '\0' 了并且进入循环了,说明两个字符串比较完成了,没有不相等的字符
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;//两个字符的差作为返回值
}
int main()
{
	char* str1 = "abbbcd";
	char* str2 = "abbbdd";
	int ret = my_strcmp(str1, str2);
	if (ret > 0)
		printf("str1 > str2\n");
	else if (ret < 0)
		printf("str1 < str2\n");
	else
		printf("str1 == str2\n");
	return 0;
}

4. strcat - Zeichenfolge anhängen

4.1 Deklaration und Verwendung von strcat

 Wir verwenden die cplusplus- Website, um die Deklaration von strcat und die Bedeutung der einzelnen Parameter zu beachten.

Übersetzen Sie es bis zur Verwendung der strcat-Funktion: Hängen Sie die Zeichenfolge, auf die der Quellzeiger zeigt, an das Array an, auf das der Zielzeiger zeigt, und es ist genügend Platz vorhanden (ich habe versucht, an die Zeichenfolge anzuhängen, bin jedoch fehlgeschlagen) und die angehängte Position ist der Zielzeiger auf '\0' des Strings, also ab dieser Position kopieren . Beachten Sie, dass die Position des angehängten '\0 ' die Position des ersten '\0' ist .

4.2 Verwendung von strcat 

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

int main()
{
	char str1[50] = "row row row your boat,";
	char* str2 = "gently down the stream";
	strcat(str1, str2);
	printf("%s\n", str1);
	return 0;
}

4.3 Simulationsimplementierung von strcat 

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

char* my_strcat(char* dest, const char* src)//src 指向的字符串是不改变内容的,所以用 const 修饰
{
	assert(dest && src);//确保两个指针有效
	char* ret = dest;
	while (*dest)
		dest++;//先找到 dest 指向的数组的第一个 '\0' 的位置
	while (*dest++ = *src++)//拷贝
		;
	return ret;
}
int main()
{
	char str1[50] = "row row row your boat,";
	char* str2 = "gently down the stream";
	my_strcat(str1, str2);
	printf("%s\n", str1);
	return 0;
}

5. strncpy - längenbegrenzte String-Kopie

5.1 Deklaration und Verwendung von strncpy

Der Unterschied zwischen strncpy und strcpy besteht darin, dass strncpy einen weiteren Parameter hat . Dieser Parameter ist eine Ganzzahl ohne Vorzeichen , d. h. Sie können anpassen, wie viele Bytes des Inhalts kopiert werden sollen . Dies erleichtert unsere Verwendung erheblich und verbessert die Flexibilität der C-Sprache.

5.2 Verwendung von strncpy

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

int main()
{
	char str1[20] = "row your boat";
	char str2[] = "hello world";
	strncpy(str1, str2, 3);//我们从 str2 中拷贝三个字节的内容到 str1 去
	printf("%s\n", str1);
	return 0;
}

 

 Wir können sehen, dass die Ausgabe sehr seltsam ist, denn wenn wir nur drei Bytes Inhalt kopieren, fügt strncpy kein '\0' am Ende hinzu (d. h. kopiert so viel Inhalt, wie wir wollen) . Wir können den Inhalt des str1-Arrays vor dem Kopieren sehen.

5.3 Simulationsimplementierung von strncpy

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

char* my_strncpy(char* dest, const char* src, unsigned int num)
{
	assert(dest && src);//确保两个指针有效
	char* ret = dest;

	while (num--)//拷贝几个字节
	{
		*dest = *src;
		dest++;
		src++;
	}

	return ret;
}
int main()
{
	char str1[20] = "row your boat";
	char str2[] = "hello world";
	my_strncpy(str1, str2, 3);
	printf("%s\n", str1);
	return 0;
}

6. strncmp – Längenbegrenzter String-Vergleich

6.1 Deklaration und Verwendung von strncmp

Die Funktionen von strncmp und strcmp sind genau gleich, und das Prinzip ist genau dasselbe. Das heißt, wenn Sie strcmp beherrschen, können Sie strncmp beherrschen. strncmp hat nur einen Parameter mehr als strcmp , bei dem es sich um eine vorzeichenlose Ganzzahl handelt, die Bytes darstellt. Das heißt, wie viele Bytes wir vergleichen möchten. Die Deklaration dieser Funktion und die Bedeutung der einzelnen Parameter können wir über die cplusplus- Website einsehen.

6.2 Verwendung von strncmp

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

int main()
{
	char* str1 = "abbbcd";
	char* str2 = "abbbdd";
	int ret=strncmp(str1, str2,3);//我们只想比较字符串的前三个字节
	if (ret > 0)
		printf("str1 > str2\n");
	else if (ret < 0)
		printf("str1 < str2\n");
	else
		printf("str1 == str2\n");
	return 0;
}

 

6.3 Simulationsimplementierung von strncmp

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

int my_strncmp(const char* str1, const char* str2, unsigned int num)//两个字符串的内容都不需要变,所以用 const 修饰
{
	assert(str1 && str2);
	while (num-- && *str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char* str1 = "abbbcd";
	char* str2 = "abbbdd";
	int ret = my_strncmp(str1, str2, 3);//我们只想比较字符串的前三个字节
	if (ret > 0)
		printf("str1 > str2\n");
	else if (ret < 0)
		printf("str1 < str2\n");
	else
		printf("str1 == str2\n");
	return 0;
}

7. strncat - Fügt einen String mit begrenzter Länge an

7.1 Deklaration und Verwendung von strncat

Auf die gleiche Weise können Sie, wenn Sie strcat beherrschen, auch strncat beherrschen. strncat hat einen zusätzlichen Parameter einer vorzeichenlosen Ganzzahl, deren Bedeutung die Anzahl der Bytes darstellt. Das heißt, wir können anpassen, wie viele Zeichen wir an das Ende einer anderen Zeichenfolge anhängen möchten . Wir können die Deklaration von strncat und die Bedeutung jedes Parameters über die cplusplus- Website beobachten.

 

7.2 Verwendung von strncat

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

int main()
{
	char str1[50] = "row row row your boat,";
	char str2[] = "gently down the stream";
	strncat(str1, str2, 6);//我们只想追加 6 个字节的字符到 str1 中
	printf("%s\n", str1);
	return 0;
}

 Wenn wir hier aufpassen, werden wir ein Problem finden. Die letzten 6 Bytes der Zeichen , die wir anhängen, enthalten kein '\0' , aber wenn die endgültige Ausgabe gedruckt wird, scheint es am Ende der Zeichenfolge ein '\0' zu geben. Dann muss dies die Eigenschaften von strncat erwähnen, das heißt, strncat fügt '\0' nach der anzuhängenden Zeichenfolge hinzu .

 7.3 Simulationsimplementierung von strncat

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

char* my_strncat(char* dest, const char* src, unsigned int num)//str2 中的字符串不需要被修改,所以用 const 修饰
{
	assert(dest && src);//确保两个指针是有效指针
	char* ret = dest;//记录返回值

	while (*dest)//先找到 dest 指向的 '\0' 的位置
		dest++;
	while (num-- && (*dest++ = *src++) )//拷贝限制的字节数
		;
	*dest = '\0';

	return ret;

}
int main()
{
	char str1[50] = "row row row your boat,";
	char str2[] = "gently down the stream";
	my_strncat(str1, str2, 8);
	printf("%s\n", str1);
	return 0;
}

Zusammenfassung

Wir haben oben eine Reihe von Zeichenfolgenfunktionen mit unbegrenzter Länge und Zeichenfolgenfunktionen mit eingeschränkter Länge behandelt. Was ist also der Unterschied zwischen eingeschränkt und uneingeschränkt? Zunächst einmal ist die Flexibilität uneingeschränkter Stringfunktionen relativ gering , da nur der ganze String manipuliert werden kann. Allerdings ist die Flexibilität der eingeschränkten String-Funktion relativ hoch, und die Anzahl der zu manipulierenden Zeichen kann angepasst werden. Außerdem sind Zeichenfolgenfunktionen mit begrenzter Länge sicherer als Zeichenfolgenfunktionen mit unbegrenzter Länge . Beachten Sie, dass eingeschränkt sicherer ist als uneingeschränkt.

8. strstr - Zeichenkettensuche

8.1 Deklaration und Verwendung von strstr

strstr ist buchstäblich zwei Zeichenfolgen. Dann ist seine Bedeutung, eine andere Zeichenfolge in einer der Zeichenfolgen zu finden . Wir können die Deklaration von strstr und die Bedeutung jedes Parameters über die cplusplus- Website beobachten.

Wir können einige Prinzipien von strstr kennen, indem wir es übersetzen. Wenn die Zeichenfolge 2 in der Zeichenfolge 1 gefunden wird, wird die erste Adresse der Zeichenfolge 2 in der Zeichenfolge 1 zurückgegeben. Wenn die Zeichenfolge nicht gefunden wird, wird ein Nullzeiger zurückgegeben .

8.2 Verwendung von strstr

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

int main()
{
	char* str1 = "row row row your boat,gently down the stream";
	char* str2 = "row your boat";
	char* ret = strstr(str1, str2);//在 str1 中查找 str2 
	printf("%s\n", ret);
	return 0;
}

Es ist ersichtlich, dass der Rückgabewert die erste Adresse des  ersten Vorkommens von str2 in str1 ist.

8.3 Mock-Implementierung von strstr

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

char* my_strstr(const char* str1, const char* str2)//不需要改变其内容,用 const 修饰
{
	assert(str1 && str2);//避免是无效指针
	const char* s1 = str1;
	const char* s2 = str2;
	const char* cp = str1;//这个指针变量是至关重要的
	while (*cp)
	{
		s1 = cp;
		s2 = str2;

		//在 str1 中查找 str2 的核心循环
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')//查找完成
			return (char*)cp;

		cp++;
	}
	return NULL;
}
int main()
{
	char* str1 = "row row row your boat,gently down the stream";
	char* str2 = "row your boat";
	char* ret = my_strstr(str1, str2);
	printf("%s\n", ret);
	return 0;
}

Lassen Sie uns die Idee im Detail erklären,  indem wir ein Bild zeichnen .

 

 

 

 9. strtok - String-Slicing

9.1 Deklaration und Nutzen von strtok

Für diese Funktion müssen wir nur die grundlegende Verwendung verstehen. Wir verwenden die cplusplus- Website, um die Deklaration von strtok und die Bedeutung der einzelnen Parameter zu beachten.

Dieser englische Absatz ist zu lang, lassen Sie mich den Kernteil erklären: Wir stellen zwei Parameter für strtok bereit, einer ist ein String und der andere ist das zu schneidende Token. Wenn das Token in der Zeichenfolge vorkommt, wird die Position auf '\0' geändert und die Adresse der Zeichenfolge, bevor das Token zurückgegeben wird . Wenn Sie Parameter zweimal übergeben möchten, müssen Sie nur einen Nullzeiger übergeben.

9.2 Verwendung von strtok

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

int main()
{
	char* str1 = "row@row~row%your^boat,gently@down~the^stream";
	char* str2 = "@~%^";

	//将 str1 拷贝至 tmp 数组,这样不会丢失 str1 的原始数据
	char tmp[50] = { 0 };
	strcpy(tmp, str1);

	char* ret = NULL;
	for (ret = strtok(tmp, str2); ret != NULL; ret = strtok(NULL, str2))
	{
		printf("%s ", ret);
	}
	return 0;
}

10. strerror - Analyse des Fehlercodes

10.1 Deklaration und Verwendung von strerror

Ein Punkt, den wir bekannt machen müssen, ist, dass es in der Sprache C, wenn ein Programmfehler auftritt, eine versteckte globale Variable errno gibt , die eine ganze Zahl ist, wie 0, 1, 2, 3, ... usw. Sie alle stellen verschiedene Fehlermeldungen dar, und die Rolle von strerror besteht darin, diesen Fehlercode zu übersetzen . Wir können die Deklaration von strerror und die Bedeutung jedes Parameters  über die cplusplus- Website beobachten.

10.2 Verwendung von strerror

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

int main()
{
	FILE* p;
	p = fopen("test.txt", "r");//在我们的工程目录下并没有 test.txt 这个文件
	if (p == NULL)//那么打不开 p 就是一个空指针
	{
		printf("%s\n", strerror(errno));//这里就会解释为什么是空指针的原因
	}
	return 0;
}

 

Ich denke du magst

Origin blog.csdn.net/weixin_59913110/article/details/125657140
Empfohlen
Rangfolge