Verwendung der getchar-Funktion in C
-
Verwenden Sie die Funktion
getchar
, um ein einzelnes Zeichen aus dem Standard-Eingangsstrom in C zu lesen -
Verwendung der Funktion
getchar
zum Lesen von Zeichenketteneingaben in C
In diesem Artikel werden mehrere Methoden zur Verwendung der Funktion getchar
in C vorgestellt.
Verwenden Sie die Funktion getchar
, um ein einzelnes Zeichen aus dem Standard-Eingangsstrom in C zu lesen
Die Funktion getchar
ist Teil der Standard-Eingabe-/Ausgabe-Utilities, die in der C-Bibliothek enthalten sind. Es gibt mehrere Funktionen für Zeichenein-/-ausgabeoperationen wie fgetc
, getc
, fputc
oder putchar
. Die Funktionen fgetc
und getc
sind im Prinzip gleichwertig; sie nehmen einen Dateistromzeiger, um ein Zeichen zu lesen, und geben es als unsigned char
zurück, das in einen int
-Typ gecastet wurde.
Beachten Sie, dass getchar
der spezielle Fall von getc
ist, der implizit den stdin
-Dateistrom als Argument übergibt, um Zeichen daraus zu lesen. Daher nimmt getchar
keine Argumente entgegen und gibt das gelesene Zeichen in einen int
-Typ umgewandelt zurück. Im folgenden Beispiel demonstrieren wir das grundlegende Szenario der Eingabe eines einzelnen Zeichens und dessen Ausgabe mit der Funktion putchar
.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int ch;
printf("Please, input a single character: ");
ch = getchar();
putchar(ch);
exit(EXIT_SUCCESS);
}
Verwendung der Funktion getchar
zum Lesen von Zeichenketteneingaben in C
Alternativ können wir eine Schleife implementieren, um die Zeichenketteneingabe zu lesen, bis die neue Zeile oder EOF
erreicht ist, und sie in einem vorher zugewiesenen char
-Puffer zu speichern. Beachten Sie jedoch, dass diese Methode im Vergleich zu Aufrufen von gets
oder getline
, die Bibliotheksfunktionen sind, die dieselbe Funktion implementieren, einen zusätzlichen Performance-Overhead bedeutet. Der Hauptteil der Lösung ist eine while
-Schleife, die solange ausgeführt wird, bis der von der Funktion getchar
zurückgegebene Wert ungleich dem neuen Zeilenzeichen oder EOF
ist.
In diesem Fall haben wir willkürlich ein char
-Array der Größe - 20 Zeichen zugewiesen. Bei jeder Iteration wird der Zeiger auf das erste Element des Arrays implementiert, und der Rückgabewert von getchar
wird ihm zugewiesen. Schließlich geben wir den Puffer mit dem Funktionsaufruf printf
aus.
#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 20 };
int main(void) {
char buf[SIZE];
char *p;
int ch;
p = buf;
printf("Please, provide input: ");
while ((ch = getchar()) != '\n' && ch != EOF) {
*p++ = (char)ch;
}
*p++ = 0;
if (ch == EOF) {
printf("EOF encountered\n");
}
printf("%s\n", buf);
exit(EXIT_SUCCESS);
}
Ausgabe:
Please, provide input: string longer than 20 characters
string longer than 20 characters
Auch wenn der vorherige Beispielcode normalerweise gut funktioniert, weist er einige Fehler auf, die zu Pufferüberlauffehlern oder einem abnormalen Programmabbruch führen können. Da wir die Benutzereingabe bis zur neuen Zeile oder EOF
verarbeiten, gibt es keine Garantie, dass sie in den Puffer mit fester Größe char
passt. Wenn wir einen festen Puffer verwenden müssen, sind wir dafür verantwortlich, die Größe der Eingabe zu zählen und das Speichern im Puffer zu stoppen, wenn die Kapazität erreicht ist.
Nachdem wir dieses Problem im vorherigen Code gelöst haben, müssen wir uns mit der printf
-Anweisung befassen, die den %s
-Spezifizierer verwendet, um den Pufferinhalt zu drucken. Beachten Sie, dass es keine Garantie dafür gibt, dass das letzte Zeichen der Eingabezeichenkette ein Null-Byte ist, so dass der printf
-Aufruf nicht weiß, wo er aufhören soll, wenn der Benutzer selbst das Null-Byte nicht am Ende des Puffers einfügt. Der folgende Beispielcode korrigiert die vorherigen Fehler und fügt zur besseren Demonstration einige Zeilen hinzu.
#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 20 };
int main(void) {
char buf[SIZE];
int ch;
size_t index = 0;
size_t chars_read = 0;
printf("Please, provide input: ");
while ((ch = getchar()) != '\n' && ch != EOF) {
if (index < sizeof(buf) - 1) {
buf[index++] = (char)ch;
}
chars_read++;
}
buf[index] = '\0';
if (ch == EOF) {
printf("EOF encountered\n");
}
if (chars_read > index) {
printf("Truncation occured!\n");
}
printf("%s\n", buf);
exit(EXIT_SUCCESS);
}
Ausgabe:
Please, provide input: string longer than 20 characters
Truncation occured!
string longer than
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook