Ich arbeite an einer Aufgabe und als Teil davon muss ich die Ganzzahl aus einer Zeichenfolge extrahieren.
Ich habe versucht, die atoi()
Funktion zu verwenden, aber sie gibt immer a zurück 0
, also habe ich auf umgeschaltet strtol()
, aber es wird immer noch a zurückgegeben 0
.
Ziel ist es, die Ganzzahlen aus der Zeichenfolge zu extrahieren und als Argumente an eine andere Funktion zu übergeben. Ich verwende eine Funktion, die diese Werte verwendet, um einige Daten zu aktualisieren ( update_stats
).
Bitte denken Sie daran, dass ich ziemlich neu in der Programmierung in der C-Sprache bin, aber dies war mein Versuch:
void get_number (char str[]) {
char *end;
int num;
num = strtol(str, &end, 10);
update_stats(num);
num = strtol(end, &end, 10);
update_stats(num);
}
Der Zweck ist , in einem String "e5 d8"
(zum Beispiel) Ich würde das extrahieren 5
und die 8
aus dieser Zeichenfolge.
Das Format der Zeichenfolge ist immer gleich.
Wie kann ich das machen?
quelle
isdigit
bevor Sie verwendenstrtol
atoi
undstrtol
erwarten, den Zeiger auf das erste Zeichen einer Ziffer zu erhalten - Ihr Zeiger muss bereits auf eine Ziffer zeigen. Weder "e" noch "d" ist eine Ziffer, wenn die Basis 10 ist. Um die Ziffern in der Zeichenfolge zu finden, sollten Sie Code schreiben, um jedes Zeichen zu untersuchen, um festzustellen, ob es eine Ziffer ist oder nicht. Sobald Sie eine Ziffer gefunden haben, können Sie sie entweder (nur eine Ziffer) oder die Ziffernfolge (mehrere Ziffern) in eine Zahl umwandeln, je nachdem, was Sie benötigen."e5 d8"
tostrtol
ist kein korrekter Weg, um die „5“ zu finden und in eine Zahl umzuwandeln.Antworten:
strtol
nicht findet eine Zahl in einem String. Es konvertiert die Zahl am Anfang der Zeichenfolge . (Es werden keine Leerzeichen übersprungen, aber sonst nichts.)Wenn Sie herausfinden möchten, wo eine Nummer beginnt, können Sie Folgendes verwenden:
(
man strpbrk
)Wenn Ihre Nummern signiert sein könnten, benötigen Sie etwas Anspruchsvolleres. Eine Möglichkeit besteht darin, die oben genannten Schritte auszuführen und dann ein Zeichen zu sichern, wenn das vorherige Zeichen vorhanden ist
-
. Aber achten Sie auf den Anfang der Zeichenfolge:Nur
-
in dasstrpbrk
Argument zu setzen, würde falsche Übereinstimmungen bei der Eingabe wie erzeugennon-numeric7
.quelle
Wenn das Format immer so ist, könnte dies auch funktionieren
Ausgabe
%[^0-9]
stimmt mit jedem nichtstelligen Zeichen überein. Wenn Sie Folgendes hinzufügen, bedeutet*
dies%*[^0-9]
, dass die Daten aus der Zeichenfolge gelesen, aber ignoriert werden sollen.quelle
sscanf
. Ich schätze die Mühe sehr. Es wird jedoch nirgends angegeben, dass das Format so ist, wie Sie es für selbstverständlich gehalten haben. Versuchen Sie, etwas mehr Großzügigkeit hinzuzufügen, wenn Sie können. Wenn der Benutzer in der Konvertierung von E / A und Zeichenfolge in Ganzzahl steckt, besteht eine hohe Wahrscheinlichkeit, dass er neu ist. Es wäre also sehr hilfreich, einen Link zur Dokumentation hinzuzufügen oder zumindest bereitzustellen, z. B. in diesem Fallsscanf
. Schöne Antwort aber :)sscanf
ist die Dokumentation. Ich denke, was hier wirklich verbessert werden kann, ist eine kleine Erklärung des Formats, das ich hier hinzufügen darf.Ich schlage vor, Sie schreiben die Logik selbst. Ich weiß, es ist, als würde man das Rad neu erfinden , aber in diesem Fall haben Sie einen Einblick in die Funktionsweise der Bibliothek.
Hier ist eine Funktion, die ich vorschlage:
Vergiss nicht, einen String mit einem
\0
am Ende zu übergeben :)quelle
c
, Sie Bool int und konvertieren könnentrue
undfalse
zu1
und0
jeweils