2012-11-21 11 views
25

che sto parsing di una stringa (una char*) e sto usando sscanf per analizzare i numeri dalla stringa in doppie, in questo modo:Ottieni il numero di caratteri letti da sscanf?

// char* expression; 
double value = 0; 
sscanf(expression, "%lf", &value); 

Questa grande opera, ma Vorrei poi continuare l'analisi del stringa attraverso mezzi convenzionali. Ho bisogno di sapere quanti caratteri sono stati analizzati da sscanf in modo che possa riprendere la mia analisi manuale dal nuovo offset.

Ovviamente, il modo più semplice sarebbe quella di calcolare in qualche modo il numero di caratteri che sscanf analizza, ma se non c'è un modo semplice per farlo, ho am aperta alle opzioni di analisi doppie alternative. Tuttavia, attualmente sto usando sscanf perché è veloce, semplice e leggibile. Ad ogni modo, ho solo bisogno di un modo per valutare il doppio e continuare ad analizzarlo dopo.

risposta

39

È possibile utilizzare l'identificatore di formato %n e fornire un ulteriore argomento int *-sscanf():

int pos; 
sscanf(expression, "%lf%n", &value, &pos); 

Descrizione per di formato n dallo standard C99:

Nessun ingresso è consumato. L'argomento corrispondente deve essere un puntatore al numero intero con segno in cui deve essere scritto il numero di caratteri letti dal flusso di input fino ad ora da questa chiamata alla funzione fscanf. L'esecuzione di una direttiva %n non incrementa il conteggio delle assegnazioni restituito al termine dell'esecuzione della funzione fscanf. Nessun argomento viene convertito, ma uno viene consumato. Se la specifica di conversione include un carattere che sopprime l'assegnazione o una larghezza del campo, il comportamento non è definito.

Controllare sempre il valore restituito di sscanf() per garantire che le assegnazioni sono state effettuate, e successiva codice non fa variabili di processo erroneamente cui valori sono rimasti invariati:

/* Number of assignments made is returned, 
    which in this case must be 1. */ 
if (1 == sscanf(expression, "%lf%n", &value, &pos)) 
{ 
    /* Use 'value' and 'pos'. */ 
} 
+0

Non riesco a farlo funzionare per [implementazione Microsoft] (https://msdn.microsoft.com/en-us/library/t6z7bya3.aspx?f=255&MSPPError=-2147217396) come tale: ' sscanf_s (p, "% s% d \ n% n", toString, (int) _countof (toString), & itemCount, &pos); 'Il' pos' non sembra cambiare affatto. – c00000fd

2
int i, j, k; 
char s[20]; 

if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3) 
    ...something went wrong... 

La variabile k contiene il numero di caratteri fino al punto in cui è stata eseguita la scansione della fine del numero intero memorizzato in j.

Si noti che lo %n non viene conteggiato nelle conversioni riuscite. È possibile utilizzare %n più volte nella stringa formato se necessario.

Problemi correlati