C Programmierung: Nur int von Fgets drucken

8

Siehe main :

%Vor%

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:

%Vor%

Warum habe ich 2 und 3 zweimal erhalten?

    
user2908206 23.11.2017, 09:04
quelle

7 Antworten

6

So würde ich es machen:

%Vor%

Dies verwendet strtol() , so dass es auch negative Zahlen behandelt; Wenn das falsch ist, können Sie natürlich auch Prüfungen hinzufügen, um sie herauszufiltern. Ich denke, das ist viel besser als alles andere mit strtok() .

    
unwind 23.11.2017 09:24
quelle
5

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.

%Vor%

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 .

    
coderredoc 23.11.2017 09:07
quelle
1

Wenn es das Leerzeichen in der Eingabe erreicht, ruft es atoi() mit " 2 3" auf (was zu 2 führt) und später " 3" (was zu 3 führt), was die unerwarteten Zahlen erzeugt.

    
neuhaus 23.11.2017 09:09
quelle
0

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.

    
gsamaras 23.11.2017 09:12
quelle
0

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.

    
Lucky Luke 23.11.2017 09:33
quelle
0

Die Lösung mit strtok ist auch nicht so schwer:

%Vor%

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).

    
ilkkachu 23.11.2017 18:15
quelle
-1

Sie können isdigit oder isalpha() function (basierend auf Ihrer Verwendung) in ctype.h verwenden. Folgendes ist Codeausschnitt mit isdigit function:

%Vor%

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.

    
cse 23.11.2017 09:15
quelle

Tags und Links