Wie macht man eine gesicherte Eingabe in C?

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Bei der formatierten Eingabe kannst Du das Zeichen hinter der Zahl auch einlesen und dann untersuchen, ob es Dir genehm ist:

int zahl = 0;
char rest = '?';
int n = scanf("%d%c", &zahl, &rest);
  • Normalerweise ist danach n==2 und rest=='\n' (von der Return-Taste).
  • Wurde die Eingabe umgeleitet, kann auch n==1 vorkommen. Dann sollte rest unverändert sein; allerdings könnte sich das in einer neueren C-Version (nach C89) oder in C++ geändert haben. Deshalb würde ich mich nicht darauf verlassen.
  • Bei n==0 oder n==EOF (-1) wurde nicht einmal zahl eingelesen.

Das in rest eingelesene Zeichen ist natürlich aus der Eingabe verschwunden. Du kannst es aber mit ungetc(rest, stdin) wieder zurückstellen (für das nächste scanf()).

Sollen bestimmte Zeichen hinter der Zahl doch erlaubt sein, bietet die Formatierung %1[...] (statt %c) mehr Komfort: "%d%1[^=;]" würde z.B. ein direkt folgendes '=' oder ';' einfach in der Eingabe stehen lassen.

Woher ich das weiß:Berufserfahrung
PhoenixWright15 
Fragesteller
 03.01.2019, 15:43

kannst du mir erklären was ich hier falsch gemacht habe?

#include<stdio.h>

int main () {

int zahl;

char rest;

int n = scanf("%d%c", &zahl, &rest);

if ((n==2) && (rest==13)) {       //13 = /n (ASCII-Code)

  printf("Eingabe korrekt");

  }

else

  {

  printf("Eingabe inkorrekt");

}

  return 0;

}

Ich habe auch wie du den Datentypen einen Wert gegeben und es funktioniert leider nicht :(

Problem: Die If-Anweisung kommt immer zum else

0
ralphdieter  03.01.2019, 19:27
@PhoenixWright15

Yep, '\n' hat den Wert 10 (nicht 13). Es gibt aber sowieso keinen Grund, anstelle eines Zeichens dessen ASCII-Wert zu verwenden.

1

Buchstaben sind auch nur Zahlen. Daher kannst Du diese gut vergleichen und einfach überprüfen, ob der eingelesene Buchstabe zwischen 0 und 9 liegt.

#include <stdio.h>

int main()
{
  int c;

  while ((c = getchar()) != EOF)
    if (c >= '0' && c <= '9')
      putchar(c);

  return 0;
}

In diesem Beispiel werden die Zahlen einfach ausgegeben und alle anderen Zeichen ignoriert. Ersetze also die Zeile mit putchar(c); durch deine eigene Logik.

Woher ich das weiß:Studium / Ausbildung

Zahlen... gehts etwas genauer? signed? unsigned? Integer? Wie viel Bit? Double? Float? Darf es auch ein char array sein?

Woher ich das weiß:Hobby
milos2  03.01.2019, 19:07

Ich denke er meint 0 - 9.

0

die Anzahl der Zeichen überwachen >< und ob die Zahlen zwischen 0 und 9 sind

Joa zu jedem ASCII Zeichen den Code herausfinden und prüfen ob der in dem richtigen Intervall liegt.