2016-08-05 9 views
2

Ich suche eine Funktion, die eine Zeichenfolge folgt überprüft, ob (Spiele genau) das Muster der Daten durch die zusätzlichen Argumente an die angegebene format Zeichenfolge entspricht wie folgt aus:Gibt es eine Art 'strcmpf' Implementierung?

/* int strcmpf (char *str1, char *format, ...); */ 
char *test = "Hello World !" 

if(!strcmpf(test, "%s%*s %c", "Hello ", '!') 
    return HELLO_HAS_BEEN_SAID; 
else 
    return PROGRAM_ISNT_POLITE; 

diese selbst implementieren Ich gehe davon wird sehr schwierig, aber eine solche Funktion könnte sehr nützlich für das semantische Parsen von Inhalten sein. Bevor ich versuche, eine solche Funktion selbst zu schreiben, muss ich wissen, ob es bereits eine Bibliothek oder ein Code-Snippet gibt, das die Implementierung einer solchen Funktion ermöglicht?


Um genauer zu sein, brauche ich Muster-Matching-Verhalten. So muss test genau mit dem Muster übereinstimmen, das durch die Daten angegeben wird, die dem Parameter format entsprechen.

+5

Die Implementierung einer solchen Funktion ist sehr einfach, verwenden Sie einfach ['vsnprintf'] (http://en.cppreference.com/w/c/io/vfprintf) zum Formatieren und rufen Sie dann' strcmp' auf. –

+1

@JoachimPileborg Ganz richtig, aber wenn ich es in eine Funktion zusammen mit einem Aufruf von 'strcmp()' setzen muss, muss ich noch variadic Argumente für die Funktion bereitstellen. Was ist nicht "sehr einfach" für alle, stimmst du nicht zu? Scheint mir nicht so praktisch zu sein .. – Malina

+0

@JoachimPileborg: Was jetzt? Woher kommt "Welt" in Ihrer vorgeschlagenen Lösung? –

Antwort

3

Ich muss wissen, ob es bereits eine Bibliothek oder Code-Schnipsel, die

Die Standardbibliothek keine solche Funktionalität hat wie diese Implementierung einer Funktion zur Verfügung stellt. Anforderungen für Bibliotheksempfehlungen von Drittanbietern sind hier nicht relevant, aber soweit ich die gewünschte Funktionalität verstehe, ist mir eine vorhandene Implementierung von Drittanbietern ohnehin nicht bekannt.

Wie ich in den Kommentaren gesagt, schlage ich vor, dass Sie das Seiten Pattern-Matching-Design um bona fide reguläre Ausdrücke statt um printf() oder scanf() Formate (was nicht ganz gleich sind). Es gibt mehrere Bibliotheken für reguläre Ausdrücke, die diesen Teil unterstützen.

+0

Das Problem bei der Erklärung kam aus dem ich verlasse mich auf Menschen Verständnis, warum es ist "strcmpf" nicht "sscanfcmp" ich denke. – Malina

+0

Der eigentliche Grund, warum ich eine Funktion wie diese brauche, ist die korrekte Interpretation der Debug-Informationsausgabe von gcc. Das heißt ... zu wissen, wo die Nachricht Instanz, Fehler, Warnung, Zeilenverweis, Dateipfad usw. ist :) Auf diese Weise kann ich die spezifischen Informationen hervorheben. – Malina

+0

@Malina, dafür brauchen Sie wahrscheinlich nicht einmal Regex.Die GCC-Diagnose besteht aus vier Doppelpunktfeldern (:), und Sie können sich darauf verlassen, dass die ersten drei nicht selbst Doppelpunkte enthalten. Sie können den Diagnosetext einfach in die (ersten drei) Doppelpunkte aufteilen und jedes Stück entsprechend bearbeiten. Sie können die Zeichenfolge mit 'strtok()', mit 'sscanf()' oder auf verschiedene andere Arten teilen. –

Verwandte Themen