Wie analysiere ich die Felder in einer durch Komma getrennten Zeichenkette mit Hilfe von sscanf und unterstütze leere Felder?

8

Ich habe eine durch Komma getrennte Zeichenfolge, die leere Felder enthalten könnte. Zum Beispiel:

%Vor%

Verwenden eines einfachen

%Vor%

Ich bekomme alle Werte vor dem leeren Feld und unerwartete Ergebnisse ab dem leeren Feld.

Wenn ich den Ausdruck für das leere Feld aus dem sscanf () entferne,

%Vor%

alles funktioniert gut.

Da ich nicht weiß, wann ich ein leeres Feld bekommen werde, gibt es eine Möglichkeit, den Ausdruck neu zu schreiben, um elegant mit leeren Feldern umzugehen?

    
Belrog 02.10.2009, 10:20
quelle

10 Antworten

8

Wenn Sie strtok mit dem Komma als Trennzeichen verwenden, erhalten Sie eine Liste mit Zeichenfolgen, von denen mindestens eine Null / Null-Länge ist.

Sehen Sie sich meine an Antworten Sie hier für weitere Informationen.

    
ChrisF 02.10.2009, 10:24
quelle
5

man sscanf :

  

[ Entspricht einer nicht leeren Zeichensequenz aus der angegebenen Menge von              akzeptierte Zeichen;

(Hervorhebung hinzugefügt).

    
Sinan Ünür 02.10.2009 12:43
quelle
0

Es sieht so aus, als würden Sie sich derzeit mit CSV-Werten befassen. Wenn Sie es erweitern müssen, um in Anführungszeichen gesetzte Zeichenfolgen zu behandeln (so dass Felder beispielsweise Kommas enthalten können), werden Sie feststellen, dass die scanf -Familie nicht alle Komplexitäten des Formats bewältigen kann. Daher müssen Sie einen Code verwenden, der speziell für das CSV-Format Ihrer Version entwickelt wurde.

Sie finden eine Diskussion über eine Reihe von CSV-Bibliotheksimplementierungen in Die Praxis des Programmierens ' - in C und C ++. Zweifellos gibt es viele andere verfügbar.

    
Jonathan Leffler 02.10.2009 13:26
quelle
0

scanf() gibt die Anzahl der zugewiesenen Elemente zurück. Vielleicht kannst du diese Info benutzen ...

%Vor%

Pfui! Und das ist nur für 1 fehlenden Wert
Wie von anderen Antworten gezeigt wurde, ist es viel besser, die Zeichenfolge auf die "übliche" Weise zu analysieren: fgets() und strtok() .

    
pmg 02.10.2009 13:46
quelle
0

Hier ist meine Version, um kommagetrennte int Werte zu scannen. Der Code erkennt leere und nicht ganzzahlige Felder.

%Vor%

Ergebnis:

%Vor%     
sambowry 02.10.2009 14:10
quelle
0

Setzen Sie ein '*' nach dem '%', um das Lesen zu überspringen. Außerdem ist es möglich, nur 3 Zeichen zu lesen, zB '% 3s'.

    
hanoo 30.10.2012 05:41
quelle
0

Ich bin hier angekommen und suche nach Antworten auf dieselbe Frage. Ich wollte die scanf-Funktion auch nicht hinter mir lassen. Am Ende baute ich selbst ein zsscanf, wo ich das Format analysierte, alle Daten eins nach dem anderen scannte und die Rückgabe von sscanf überprüfte, um zu sehen, ob ich ein leeres gelesen habe. Dies war etwas mein besonderer Fall: Ich wollte nur einige der Felder, von denen einige leer sein könnten, und konnte das Trennzeichen nicht übernehmen.

%Vor%

Ausgabe:

%Vor%

Seien Sie gewarnt, es ist nicht vollständig getestet und hat schwerwiegende Einschränkungen (die offensichtlichsten: akzeptiert nur %...s , %...c , %...[...] und erfordert Separatoren als %...[...] ; sonst hätte ich mir wirklich darum kümmern müssen die format string, so interessiert mich nur % ).

    
dmcontador 29.01.2014 12:11
quelle
0

Ich musste diesen Code ein wenig ändern, um richtig zu funktionieren:

%Vor%

und die Ausgabe:

%Vor%     
xerostomus 29.04.2014 20:44
quelle
0

Ich habe eine Änderung für tabulatorgetrennte TSV-Dateien vorgenommen, hoffentlich kann es helfen:

%Vor%

Und die Ausgabe:

%Vor%     
xerostomus 29.04.2014 21:01
quelle
0

Es gibt einige Probleme mit strtok () , die hier aufgelistet sind: Ссылка

Daher ist es besser strtok zu vermeiden.

Betrachten Sie nun eine Zeichenfolge mit einem leeren Feld wie folgt:

%Vor%

Sie können die Funktion simple verwenden, um String im CSV-Format konvertieren zu können, um sie in ein float-Array zu lesen:

%Vor%

Finden Sie die Verwendung unten:

%Vor%

Ausgabe lautet wie folgt:

%Vor%     
Sashank Bhogu 23.09.2016 14:30
quelle

Tags und Links