2012-04-15 12 views
0

Wie kann ich das erste Zeichen unescaped in einem String finden? Im folgenden Code, erhalte ich die ersten Zeichen an Position 14, aber ich bin auf der Suche, die eine an Position 26.Erstes Vorkommnis mit Ausnahme von Escapezeichen in C

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str[] = "FOO + pHWAx \\\"bar AER/2.1\" BAZ"; 
    printf ("%s\n",str); 
    char * pch; 
    pch=strchr(str,'"'); 
    printf ("found at %d\n",pch-str+1); 
    return 0; 
} 
+0

Zufällig wäre das nicht zufällig Hausaufgaben, wo es diktiert wird, dass 'strchr' verwendet werden muss? – Kaz

+0

@Kaz: danke! Nein, ich dachte nur, 'strchr' würde mit großen Saiten besser spielen. – Kayla

Antwort

0

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.

+2

Trivia: Die Terminologie "break" ('strpbrk', Zeiger auf Bruch) und" span "(' strspn', 'strcspn') stammen aus den Musterfunktionen BREAK und SPAN in der Textverarbeitungssprache SNOBOL. – Kaz

+0

würde nicht 'string = ++ ptr;' muss 'string = ptr + 2 sein;' so überspringt es das Zitat? – Kayla

+0

Ja sorry, das ist fehlerhaft. Ich werde es reparieren. – Kaz