Verwenden Sie die strpbrk
Funktion zum ersten Auftreten eines von mehreren Zeichen suchen auf einmal . Sie dürfen das Escape-Zeichen nicht überspringen. Sie müssen überprüfen, ob der Charakter, den Sie wirklich suchen, gefolgt wird.
I.e. Angenommen, wir möchten nach "
suchen, das als \"
escaped werden kann. Eigentlich bedeutet dies, dass wir nach "
oder \
suchen müssen. Mit anderen Worten:
char *ptr = strpbrk(string, "\"\\"); /* look for chars in the set { ", \ } */
Aber wir haben dies in einer Schleife zu tun, weil wir nicht daran interessiert entgangen Zitate sind und in Gang halten:
char *quote = 0;
char *string = str; /* initially points to the str array */
while (*string != 0) {
char *ptr = strpbrk(string, "\"\\");
Als nächstes werden wir prüfen, ob wir etwas gefunden:
if (!ptr)
break;
Wenn wir etwas gefunden, ist notwendigerweise ein \
oder "
:
if (*ptr == '"') {
quote = ptr;
break;
}
Wenn es kein Zitat ist, dann muss es ein Escape sein. Wir erhöhen auf das nächste Zeichen. Wenn es sich um einen abschließenden Nullwert handelt, bedeutet dies, dass wir am Ende eines Strings einen umgekehrten Schrägstrich haben: ein falsches Escape.
if (*++ptr == 0)
break;
Ansonsten können wir das nächste Zeichen überspringen und die Schleife weiterhin für die nächste Flucht oder unescaped Zitat zu scannen.
string = ++ptr;
}
Wenn ein unescaped Zitat auftritt, dann quote
Punkte, um es nach der Ausführung der while-Schleife. Ansonsten bleibt quote
Null.
Dieser Code setzt voraus, dass neben \"
weitere Escapezeichen existieren, die jedoch alle ein Zeichen lang sind, z. \b
oder \r
. Es wird nicht funktionieren, wenn es längere Escapes wie \xff
gibt. Fluchten stellen die Konventionen einer Sprache dar: Sie müssen wissen, was die Sprache ist, die Sie bearbeiten, um es richtig zu machen.
Zufällig wäre das nicht zufällig Hausaufgaben, wo es diktiert wird, dass 'strchr' verwendet werden muss? – Kaz
@Kaz: danke! Nein, ich dachte nur, 'strchr' würde mit großen Saiten besser spielen. – Kayla