2016-05-27 8 views
0

Ich analysiere eine Zeile, um eine Zeichenfolge aus einer Reihe von Parens zu extrahieren, aber in Instanzen, wo mehrere verschachtelte Parens sind, bekomme ich nichts, wenn ich ProcName drucke.bekomme ich korrekte Formatierung von sscanf() in c

z.B. 109765 ((Test)) bla bla

sscanf(line,"%*d (%[^'('')']", procName); 

Dieses Format soll eine links paren finden dann die Zeichenkette zurück, während eine beliebige Anzahl von links und rechts parens ignorieren, aber es funktioniert nicht in diesem speziellen Fall. Wenn es jedoch nur einen Satz von Parens gibt, funktioniert es einwandfrei.

Irgendeine Idee, was ich hier fehlen könnte? Danke im Voraus!

+0

Dieser scanf Aufruf sieht ziemlich durcheinander. Warum denkst du, dass der negierte Zeichensatz * Klammern ignoriert? Und was ist los mit diesen einfachen Anführungszeichen? – user2357112

Antwort

2

des OP "(" Matches genau 1 '('.
Verwenden Sie "%*[(]" zum Scannen 1 oder mehr '('.

Es ist besser, den String-Eingang zu begrenzen.
Das Aufbrechen von Formateingabestücken ist einfacher zu erkennen.
Überprüfen Sie den Rückgabewert.

char procName[100]; 
int cnt = sscanf(line,"%*d" " %*[(]" "%99[^()']", procName); 
if (cnt == 1) OK(); 
+0

Das funktioniert perfekt. Vielen Dank! – fatalError

2

Anstatt die Frage über sscanf zu beantworten, habe ich das Problem angesprochen, das funktioniert, egal wie viele Klammern es gibt.

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

int main(void) { 
    char input[1024]; 
    char funcname[33]; 
    char *start, *finis; 
    size_t len; 
    if(fgets(input, sizeof input, stdin) == NULL) 
     return 1; 

    if ((start = strrchr(input, '(')) == NULL) // find last '(' 
     return 1; 
    start++;          // move past the bracket 
    if ((finis = strchr(start, ')')) == NULL)  // find next ')' 
     return 1; 

    if ((len = finis - start) >= sizeof funcname) 
     return 1; 

    memcpy(funcname, start, len); 
    funcname [len] = '\0'; 

    printf("%s\n", funcname); 
    return 0; 
} 

Programmsitzung:

109765 ((test)) blah blah 
test