Siehe main
:
Ich möchte eine Zeile mit Zahlen vom Benutzer erhalten und alle Zahlen ohne spaces
oder tabs
erhalten.
Zum Beispiel:
Die Eingabe 1 2 3
.
Aber in diesem Fall ist dies die Ausgabe:
Warum habe ich 2
und 3
zweimal erhalten?
Weil Sie auch die Position der Zeichenfolge übergeben, die mit Leerzeichen beginnt. Sie erhalten die erste Zahl zweimal als 2
und 3
. Das ist was zurückgegeben wird.
Drucke:
%Vor% Zum Zweck der Tokenisierung können Sie strtok
verwenden und in die Zahl strtol
usw. umwandeln. Dies bietet eine viel bessere Kontrolle über die Fehlerfälle als atol/atoi
.
Aus dem Verweis von atoi()
:
Die Funktion verwirft zuerst so viele Leerzeichen (wie im Issraum), bis das erste Nicht-Leerzeichen gefunden wurde. [...]
Das heißt, wenn Sie der Funktion "2" als Eingabe geben, wird 2 zurückgegeben.
Ändern Sie dies:
%Vor%dazu:
%Vor%und Sie werden erhalten:
%Vor%Hier ist ein Tipp zum Debuggen dieses Codes: In deiner Ausgabe hast du 2 und 3 zweimal, aber nicht 1.
Mit anderen Worten, Sie erhalten die Nummer zweimal nach einem Leerzeichen . 1 hatte davor kein Leerzeichen.
Das sollte dich dazu bringen zu denken, dass dort etwas Spuk ist.
Tatsächlich würden Sie den Körper der if-Anweisung eingeben, selbst wenn str[i]
ein Leerzeichen wäre!
Wenn Sie eine Bedingung hinzufügen, um zu überprüfen, ob das aktuelle Zeichen kein Leerzeichen ist, um die boby der if-Anweisung einzugeben, überspringen Sie die Leerzeichen.
Es ist eine gute Idee, immer an Fehlerbehandlung zu denken. Was passiert, wenn der Benutzer Leerzeichen und Tabulatoren falsch drückt? Entfernen Sie zuerst Leerzeichen und Tabs, falls vorhanden:
%Vor% und dann atoi()
verwenden.
Die Lösung mit strtok
ist auch nicht so schwer:
Bedenken Sie jedoch, dass es etwas zweifelhaft ist, weil es einen versteckten Zustand verwendet (nicht gut für Multithread-Programme), und natürlich ändert es die Eingabezeichenfolge, so dass es keine Konstante sein kann (aber warum sollten Sie das tun) das).
Sie können isdigit
oder isalpha()
function (basierend auf Ihrer Verwendung) in ctype.h
verwenden. Folgendes ist Codeausschnitt mit isdigit
function:
Sehen Sie, wie es hier funktioniert.
Überprüfen Sie hier zum Beispiel auf isdigit
und isalpha()
functions.
In Bezug auf Ihre Frage:
Warum habe ich zweimal zwei und drei bekommen?
Siehe die folgende Erklärung unter cplusplus.com , die die Funktion atoi()
erläutert.
Die Funktion verwirft zuerst so viele Leerzeichen (wie im Issraum), bis das erste Nicht-Leerzeichen gefunden wurde. Ausgehend von diesem Zeichen wird dann ein optionales Anfangs-Plus- oder Minuszeichen, gefolgt von so vielen Basis-10-Stellen wie möglich, verwendet und als numerischer Wert interpretiert.