Wie macht man eine gesicherte Eingabe in C?
Wenn ich jz zum Beispiel nur Zahlen einlesen will und am Ende noch eine Buchstabe oder Sonderzeichen hinzufüge, dass das Programm sich dann stoppt und eine fehlerhafte Eingabe meldet
7 Antworten
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.
habe schon meinen Fehler entdeckt
Yep, '\n' hat den Wert 10 (nicht 13). Es gibt aber sowieso keinen Grund, anstelle eines Zeichens dessen ASCII-Wert zu verwenden.
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.
Zahlen... gehts etwas genauer? signed? unsigned? Integer? Wie viel Bit? Double? Float? Darf es auch ein char array sein?
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.
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