ANSI-C: Zeilenweise Parsen anhand Suchmuster

sylexx

Grünschnabel
Hallo,

ich habe schon im Netz gesucht, doch nirgends eine passende Antwort gefunden.

Ich möchte eine Datei zeilenweise parsen, das mache ich momentan mit fgets().
In jeder Zeile steht ein bestimmtes Muster, z.B.

LOAD <filename> AS <table>
INSERT INTO <table> <value1>, <value2>, <value2>, ...

Der String in den Spitzen klammern soll gespeichert werden, das LOAD ... ist nur dafür da, um herauszufinden, welche Operation durchgeführt werden soll. Jede Zeile soll natürlich auf ihre
Korrektheit geprüft werden.

Ich weiss nicht, wie ich das am Besten parse, ein Ansatz war:
if (sscanf(line, "LOAD %s AS %s", filename, table) == 2) {
// mach was
}
Zwar funktioniert das so halb, aber nicht so wie es sein muss. Wenn ich an dem AS etwas anhänge (ASAS), dann interpretiert er das immer noch alls korrekt.

Wie kann man da am besten vorgehen?
 
Moin nicht getestet aber versuch es mal mit:
Code:
sscanf(line, "%*s %s %*s %s", filename, table) == 2

%s* bedeutet das da ein String kommt aber Ignoriert wird!

Gruß XeoX
 
Hi.
Moin nicht getestet aber versuch es mal mit:
Code:
sscanf(line, "%*s %s %*s %s", filename, table) == 2

%s* bedeutet das da ein String kommt aber Ignoriert wird!
Was aber ziemlich unsinnig ist, wenn man den Text parsen will... Wie willst du denn die Anweisungen unterscheiden wenn es überhaupt keine Rolle spielt was da steht?

Das Problem ist, das Leerzeichen in einem scanf Formatstring für beliebig viele und irgendwelche Leerzeichen stehen (also 0 bis n).

Für solche Aufgaben verwendet man evlt. am besten einen Parser-Generator. (flex, bison usw.)

Du könntest es mit sscanf so machen:
C:
if (sscanf(line, "LOAD%*[ ] %s%*[ ] AS%*[ ] %s") == 2) {
  ...
Gruß
 
Zurück