Frage von Dieter987, 65

Ausschließlich Zahlen einlesen lassen in C?

Guten Tag,

wie kann ich in C ausschließlich Zahlen einlesen lassen? Wenn auch nur ein Buchstabe eingeben wurde soll wieder printf kommen mit "bitte geben sie ein" und dann erneutes Einlesen bis ausschließlich Zahlen von 0-9 vorhanden sind.

Danke im Voraus

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von sarahj, 47

Das ist doch fast das selbe Problem wie das letzte Mal.

Der Unterschied ist die Prüfung, ob der eingegebene String gültig ist. In der vorigen Frage war die Prüfung: "fängt der string mit 'j' oder 'n' an?"
Jetzt: "besteht der string lediglich aus Ziffern?".

Damit sollte es eigentlich klar werden, wie die Lösung aussieht.
Bitte überleg' selbst, schreib eine kleine Funktion, "allDigits(char *)" die Dir diese Frage beantwortet und bau sie in den Code ein. Übrigens, um aus dem String dann eine Zahl zu machen, nutzt man dann als Zusatzschritt "sscanf".

PS:
Es ist viel besser (und macht mehr Spaß) etwas selbst herauszufinden, anstatt sich die Lösung geben zu lassen. Wirst sehen...

PPS:
ich denke nicht, daß C/C++ gute Programmiersprachen für Anfänger sind. Ich verwende Smalltalk, da kann man den String fragen: "bestehst Du aus digits?"...

Kommentar von Dieter987 ,

Ja okay, aber an was kann ich es nun festmachen ob es Zahlen sind? Mit isdigit() jedes Zeichen überprüfen? Ich will den String auch nicht in eine Zahl umwandeln. Wichtig ist fals der Benutzer sich vertippt und einen Buchstaben oder Sonderzeichen eingibt, sollte am besten eine Meldung erscheinen "Bitte nur Zahlen eingeben" solange bis ausschließlich dezimale Zahlen eingegeben wurden. Entschuldigung für mein erneutes nachfragen, aber das Problem beschäftigt mich schon sehr lange und scheint auch in anderen Foren nur mäßig gelöst zu sein.

Kommentar von sarahj ,

ok, jetzt aber wirklich das letzte mal ;-)

Der Grundaufbau ist wie bei Deiner vorigen Frage.

int
allDigitsInString(char *cp) {
char ch;

    while ((ch = *cp++) != '\0') {
        if ((ch < '0') || (ch > '9')) return 0;
    }
    return 1;
}

readNumber() {
    ...
printf("gibt eine Zahl ein: "); fflush(stdout);
    for (;;) {
        ...zeile mit gets einlesen...
        if (allDigitsInString(line)) {
            ... was immer mit der Zeile passieren soll ...
            return;
        }
        printf("keine gültige zahl\n");
    }
}
Kommentar von Dieter987 ,

Danke, sie haben mir sehr geholfen.

Kommentar von sarahj ,

gerne. Aber hier duzen sich alle.

übrigens: isDigit() macht genau die '0'<=x<='9'-Prüfung.

Kommentar von sarahj ,

Danke für den Stern.
Schade, daß viele gleich mit C/C++ anfangen. Da muss man sich mit so viel Mist herumschlagen (wirst noch sehen Speicherverwaltung, Indexfehler usw. werden die nächsten Probleme werden...).

Nur mal so zur Info (und als Tellerrandblick);
so sähe Dein Programm in Smalltalk aus:

Hinweis zur Syntax:
  "^ x" bedeutet: "return(x)"
  "." ist statement-trenner.
  Stdout, Stdin sind standard-input/output
  "|x|" bedeutet: "lokale variable x".
  ":=" ist Zuweisung (damit man nicht "=" mit "==" verwechselt)
  x ifTrue:[...] bedeutet: mache "..." wenn x wahr ist.
  [...] loop sollte klar sein.

Der Code liefert dir dann auch gleich den numerischen Wert der Eingabe zurück ("asInteger") und kann Ganzzahlen beliebiger Länge verarbeiten (also auch eine 100-stellige Zahl, wenn es sein muss).
Mach das mal in C, C++ oder Java, und zähl die lines of code...

readNumber
Stdout show:'gib eine Zahl ein: '.
[
    |line|

    line := Stdin nextLine.
    line isAllDigits ifTrue:[
       ^ line asInteger
]
] loop
Antwort
von Infomercial, 32

Du könntest die Eingabe in ein Char-Array speichern und einfach in einer Funktion mit einer Schleife prüfen, ob jeder Char eine Ziffer ist. Sobald ein Char keine Ziffer ist, gibt die Funktion false zurück. Läuft die Schleife allerdings bis zum Ende durch, gibt sie true zurück. Dann kannst du mit dem String weiter arbeiten.

Wenn du auf Pointer verzichten willst, nimm meine Methode. Wenn du Pointer verwenden willst, nimm die Methode von sarahj

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten