C-Bibliotheksfunktionen -gets()
C-Standardbibliothek - <stdio.h>
In der Sprache C,gets()Es ist eine klassische Funktion, die verwendet wird, um Zeichenketten von der Standardeingabe zu lesen. Obwohl sie einfach zu verwenden ist, müssen Sicherheitsaspekte beachtet werden.
gets()Funktion ausder Standardeingabe stdinSie liest eine Zeile einer Zeichenkette und speichert sie im angegebenen Zeichenarray. Sie liest Zeichen, bis ein Zeilenumbruchzeichen oder Dateiende erreicht wird.
Wichtige Warnung:gets()Sie weist schwerwiegende Sicherheitslücken auf und kann die Puffergröße nicht angeben, was leicht zu einem Pufferüberlauf führen kann. Daher ist in der modernen C-Programmierungfgets()eine bessere Wahl.
Wortdefinitionen:getbedeutet "get",ssteht für "string", und zusammengesetzt bedeutet es "get string".
Grundlegende Syntax und Parameter
gets()Sie ist eine Funktion in der C-Standardbibliothek und erfordert das Einbinden der Header-Datei.<stdio.h>。
Syntaxformat
char *gets(char *str);
Parameterbeschreibung
- Parameter:
str- Typ:
char *(Zeiger auf ein Zeichenarray) - Beschreibung: Ein Zeiger auf ein Zeichenarray, der verwendet wird, um die gelesene C-Zeichenkette zu speichern. Sie müssen sicherstellen, dass das Array groß genug ist, um die Eingabezeichenkette aufzunehmen.
- Typ:
Funktionsbeschreibung
- Rückgabewert: Bei Erfolg gibt sie einen Zeiger auf
strZeiger. Wenn ein Fehler auftritt oder das Dateiende erreicht wird, ohne dass Zeichen gelesen wurden, gibt sie zurückNULL。 - Wirkung: Die gelesene Zeichenkette (ohne das Zeilenumbruchzeichen) wird gespeichert in
strdas Array, auf das gezeigt wird, und am Ende wird automatisch ein Nullzeichen angehängt.\0als Abschlusszeichen der Zeichenkette.
Beispiel
Meistern wir es anhand von Beispielengets()Verwendung.
Beispiel 1: Grundlegende Verwendung - Lesen einer Zeichenkette
Beispiel
int main()
{
char str[50];
printf("Bitte geben Sie eine Zeichenkette ein: ");
gets(str);
printf("Die eingegebene Zeichenkette ist: %s", str);
return(0);
}
Erwartete Ausgabe:
请输入一个字符串:example 您输入的字符串是:example
Codeanalyse:
#include <stdio.h>ist zu verwendengets()Voraussetzung für die Funktion.char str[50];Es definiert ein Zeichenarray der Länge 50, um die Eingabezeichenkette zu speichern.gets(str);Es liest eine Zeichenkettenzeile aus der Standardeingabe und speichert sie instrIn.printf("您输入的字符串是:%s", str);Nutzung%sFormatbezeichner geben Zeichenketten aus.
Beispiel 2: Umgang mit dem Fall, in dem der Rückgabewert NULL ist
In der tatsächlichen Programmierung sollten Sie prüfengets()den Rückgabewert, um mögliche Fehler zu behandeln.
Beispiel
int main()
{
char str[100];
char *result;
printf("Bitte geben Sie einen Inhalt ein (drücken Sie Ctrl+D zum Beenden):\n");
result = gets(str);
if (result != NULL) {
printf("Erfolgreich gelesen, der Inhalt ist:\n%s\n", str);
} else {
printf("Lesen fehlgeschlagen oder das Dateiende wurde erreicht!\n");
}
return(0);
}
Codeanalyse:
gets()Es gibt einen Zeiger auf dieselbe Zeichenkette zurück; bei einem Fehler gibt esNULL。- Wenn der Benutzer Ctrl+D (Linux/Mac) oder Ctrl+Z (Windows) drückt, wird die Dateiende-Bedingung ausgelöst,
gets()returnNULL。 - In echten Projekten wird empfohlen, die sicherere
fgets()Alternativegets()。
Beispiel 3: Sicherheitsprobleme von gets() (⚠️ Demonstration gefährlicher Operationen)
Das folgende Beispiel zeigt, warumgets()unsicher ist.
Beispiel
int main()
{
// Hinweis: Dieses Beispiel ist gefährlich und dient nur zur Demonstration!
char buffer[10];
printf("Bitte geben Sie eine längere Zeichenkette ein (mehr als 10 Zeichen):\n");
gets(buffer); // Keine Grenzenprüfung, kann einen Pufferüberlauf verursachen
printf("Sie haben eingegeben: %s\n", buffer);
return(0);
}
Codeanalyse:
buffer[10]Es werden nur 10 Bytes Speicher zugewiesen.- Wenn der Benutzer eine Zeichenkette eingibt, die 9 Zeichen überschreitet (plus das abschließende
\0), verursacht es einenPufferüberlauf, der benachbarte Speicherbereiche überschreiben kann. - Dies kann von Angreifern ausgenutzt werden, um bösartigen Code auszuführen; daher
gets()wurde es im C99-Standard als veraltet markiert und im C11-Standard sogar entfernt.
Bessere Alternative: fgets()
Es wird dringend empfohlen, dies zu verwendenfgets()stattdessen zu verwendengets(), weil es die Puffergröße angeben kann.
Beispiel
int main()
{
char str[50];
printf("Bitte geben Sie eine Zeichenkette ein: ");
// fgets(Puffer, Puffergröße, Dateistream)
fgets(str, sizeof(str), stdin);
// Entferne das von fgets gelesene Zeilenumbruchzeichen
// Methode: Finde das Zeilenumbruchzeichen und ersetze es durch ein Nullzeichen
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == '\n') {
str[i] = '\0';
break;
}
}
printf("Die eingegebene Zeichenkette ist: %s\n", str);
return(0);
}
fgets()Vorteile:
- Es kann die maximale Anzahl der zu lesenden Zeichen angeben und verhindert so einen Pufferüberlauf.
- Es behält das Zeilenumbruchzeichen am Ende der Zeichenkette bei (kann bei Bedarf manuell entfernt werden).
- Es kann die Eingabequelle angeben (Standardeingabe, Datei usw.).
Weitere Erweiterungen