Verwendung der getchar-Funktion in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion getchar, um ein einzelnes Zeichen aus dem Standard-Eingangsstrom in C zu lesen
  2. Verwendung der Funktion getchar zum Lesen von Zeichenketteneingaben in C
Verwendung der getchar-Funktion 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C Char