2016-08-12 1 views
1

Ich habe eine Datei, und ich muß überprüfen, ob seine Zeilen im folgende Format:erkennen, ob ein Linienspiel in ein Format ist - in C

Name: name1, name2, name3, name4 ...

(einige Zeichenfolge, gefolgt von ":", dann ein Leerzeichen und danach Zeichenfolgen getrennt durch ",").

Ich versuchte es mit dem folgenden Code tun:

int result =0; 

do 
{ 
    result =sscanf(rest,"%[^:]: %s%s", p1,p2,p3); 
    if(result==3) 
    { 
     printf("invalid!"); 
     fclose(fpointer); 
     return -1; 
    } 
}while (fgets(rest ,LINE , fpointer) != NULL); 

das funktioniert gut für Zeilen wie: Name: name1, name2 (mit Leerzeichen zwischen name1 und name2).

aber es funktioniert nicht mit der folgenden Zeile:

Name: name1, name2

Ich mag sscanf irgendwie sagen, nicht diesen weißen Raum vor der vermeiden ":".

könnte jemand sehen, wie?

Vielen Dank für Ihre Hilfe!

+0

Wahrscheinlich hilft '% [^,]' (mit vorangestelltem Leerzeichen, um das optionale Leerzeichen zu überspringen) und sucht nach einer Folge von Nicht-Kommas. Sie müssen auch in der Lage sein, Ihren Scan zu wiederholen, wenn Sie 3, 4, 5, ... Namen behandeln müssen. Siehe dazu [Wie verwende ich 'sscanf()' in Schleifen?] (Http://stackoverflow.com/questions/3975236/) –

+0

Also, was ist dann deine eigentliche Anforderung? * (ein String, gefolgt von ":", dann ein Leerzeichen und danach Strings getrennt durch ",") * - vielleicht sollten Sie das so umschreiben, dass zwischen jedem dieser Trennzeichen "ein oder mehrere Leerzeichen" stehen. – Groo

+0

Die Funktionsfamilie ['scanf'] (http://en.cppreference.com/w/c/io/fscanf) ist nicht wirklich gut für das allgemeine Parsing geeignet. Stattdessen möchten Sie vielleicht nach dem Doppelpunkt ''suchen:' 'mit [einige andere Funktion] (http://en.cppreference.com/w/c/string/byte/strchr) und dann verwenden Sie' sscanf', um die extrahieren andere zwei Saiten. –

Antwort

1

Dies funktioniert für mich:

result = sscanf(rest,"%[^*:]: %[^,],%s", p1, p2, p3); 

Beachten Sie die * verwendet wird, um den Raum (falls vorhanden) zu konsumieren.

+0

Das Problem war mit einem Leerraum vor ":" Es scheint, dass in Ihrer Lösung es auch – Liad

+0

auch gibt, könnte mehr als 2 Namen getrennt sein mit "," – Liad

+0

es ist keine legale Zeile, wenn es einen Leerraum vor " : " – Liad

Verwandte Themen