C-Experimente - Fehlerhafte Eingaben verhindern

Robocopy

Cadet 4th Year
Registriert
Dez. 2021
Beiträge
95
Hallo Freunde. Aus reinem Interesse überlege ich, meinen CMD-Minesweeper-Klon in C(ohne++) zu schreiben, um die Sprache ein bisschen kennenzulernen. Und da habe ich direkt eine Detailfrage:

Ich stellte fest, dass ich in C ohne mein geliebtes Exception-Handling auskommen muss. Auf Arbeit sagte mir jemand in der Kaffee-Pause, dass man als Ersatz Prüfroutinen schreiben solle.

Und da hätte ich gleich mal ein Fallbeispiel:

Code:
    public static int saveIntInput(String prompt) {
        while (true) {
            try {
                System.out.print(prompt);
                return Integer.valueOf(scanner.nextLine());

            } catch (NumberFormatException e) {
                System.out.println("Not a valid number.");
            }
        }
    }

Diese Methode holt sich vom Nutzer eine Integer-Eingabe und ist erst zufrieden, wenn der Nutzer auch wirklich ein gültiger Integer-Literal eingibt.

In C hätte ich jetzt folgende Idee:

Ich würde eine Prüfroutine schreiben, die prüft, ob alle Zeichen der vom Nutzer eingegebenen Zeichenfolge im ASCII-Code 0 bis 9 sind. Wenn die Prüfroutine irgendwann wahr zurück gibt, wird mit atoi() der Eingabe-String in eine Zahl umgewandelt.

Ist das sinnig, oder gibt es für solche Probleme schon bessere Lösungen / Konventionen?
 
Robocopy schrieb:
Ich würde eine Prüfroutine schreiben, die prüft, ob alle Zeichen der vom Nutzer eingegebenen Zeichenfolge im ASCII-Code 0 bis 9 sind. Wenn die Prüfroutine irgendwann wahr zurück gibt, wird mit atoi() der Eingabe-String in eine Zahl umgewandelt.
Kann fehlschlagen, wenn die Zahl zu groß ist:
If the converted value would be out of the range of representable values by an int, it causes undefined behavior. See strtol for a more robust cross-platform alternative when this is a possibility
https://www.cplusplus.com/reference/cstdlib/atoi/
 
KitKat::new() schrieb:

Hmm, ist atoi eine C++, oder eine C-Funktion? Manchmal schwer auseinanderzuhalten.

Internetrecherche ergab auch bei mir, dass es selbst in der Standardbibliothek, die doch bei solcherlei Sprachen eher klein sein sollte, verschiedene Funktionen gibt um das selbige zu erreichen, was es einem blutigen Anfänger (in kompilierten Sprachen) natürlich erschwert, die beste Wahl zu treffen.

Dann lautet die Devise wie wohl so oft, einfach machen, und wachsen.
 
Robocopy schrieb:
Hmm, ist atoi eine C++, oder eine C-Funktion?
C - links siehst du, dass sie aus den C std libs ist
 
  • Gefällt mir
Reaktionen: Robocopy
Robocopy schrieb:
Ich würde eine Prüfroutine schreiben, die prüft, ob alle Zeichen der vom Nutzer eingegebenen Zeichenfolge im ASCII-Code 0 bis 9 sind. Wenn die Prüfroutine irgendwann wahr zurück gibt, wird mit atoi() der Eingabe-String in eine Zahl umgewandelt.
Das genaue "wie" spielt erstmal (imho) keine Rolle. Mach Dir das Leben nicht unnötig schwer. Es reicht m.E. nach, erstmal überhaupt eine valide Zahl vom Nutzer einzulesen und irgendwas damit dann zu machen. Mit zunehmender Erfahrung entwickelst Du dann einen eigenen Stil, das sauber zu lösen. Aber für das Erlernen von C reicht es imho erstmal, eine Zahl sicher von der Tastatur einzulesen. Das kann sogar sehr simpel sein, z.B.:
C:
#include <stdio.h>

typedef enum { false, true } bool;

 bool saveIntInput(char prompt[], int* p_number)
{
 char buffer[255];
 fprintf(stdout, prompt);
 fflush(stdout);
 fgets(buffer, sizeof(buffer), stdin);
 return sscanf(buffer, "%d", p_number) > 0;
}

[...]
 int valueOf=-1;
 
 while(saveIntInput("ENTER VALID NUMBER: ", &valueOf) == false)
    printf("FOUND NOTHING\n");

 printf("FOUND NUMBER: %d\n", valueOf);
[...]
 
  • Gefällt mir
Reaktionen: phm666
Es ist eigentlich erstmal egal, welche Funktion du verwendest, aber in C solltest du prüfen, ob alle Zeichen in der erwarteten Range (als 0 bis 9) liegen. In der Doku von den Funktionen steht ja, wenn es nicht konvertiert werden kann, wird 0 zurück gegeben. Was ist denn mit dem String "0"? Ist nen valider Input, aber deiner Funktion würde es als Fehler sehen, oder deine Daten sind nachher kaputt, wenn die Eingabe Unsinn war.
 
phm666 schrieb:
Es ist eigentlich erstmal egal, welche Funktion du verwendest, aber in C solltest du prüfen, ob alle Zeichen in der erwarteten Range (als 0 bis 9) liegen. In der Doku von den Funktionen steht ja, wenn es nicht konvertiert werden kann, wird 0 zurück gegeben. Was ist denn mit dem String "0"? Ist nen valider Input, aber deiner Funktion würde es als Fehler sehen, oder deine Daten sind nachher kaputt, wenn die Eingabe Unsinn war.
Oh man. Wenn ich sowas lese, begnüge ich mich vlt. doch lieber mit Java und überlasse C den Kernel-Programmierern
 
Zuletzt bearbeitet:
Zurück
Oben