Utilizzo di sscanf: come verificare una scansione completata rispetto a una scansione interrotta

Il mio database fornisce un file di testo con apertura e chiusura " alle formule del delimitatore.Il set di formule è molto limitato e sarà facile da implementare una volta identificato.Voglio cercare di usare scanf per ottenere i parametri e voglio usare il delimitatore " per fornire un meccanismo per scanf fallire.

Nell’esempio seguente l’ultimo delimitatore viene ignorato e l’informazione che il delimitatore non è stato trovato viene persa. Come posso controllare se sscanf è in grado di eguagliare l’intera stringa?

 #include  #include  unsigned printIdentity(const char * formula){ unsigned e = 0, found = 0; double a, b; printf("-------------\n"); printf("INVESTIGATING: %s\n", formula); if( ( 2 == sscanf_s( formula, " \" X * %lf %lf \" ", &a, &b, sizeof( double ), sizeof( double ) ) ) ){ printf("MATCH: X * %lf + %lf\n", a, b); ++found; } if( ( 1 == sscanf_s( formula, " \" X * %lf \" ", &a, sizeof( double ) ) ) ){ printf("MATCH: X * %lf\n", a); ++found; } if( found != 1){ e += 1; printf("ERROR: %u formula types\n", found); } printf("-------------\n"); return e; } unsigned main( void ) { unsigned e = 0; e += printIdentity(" \"X*3.1\""); e += printIdentity(" \"X*3.2-4.2\""); e += printIdentity(" \"X*3.3+4.3\""); if( 0 != e ){ printf( "ERRORS: %2u\n", e ); } else{ printf( "all pass\n", e ); } return e; } 

Come posso controllare se sscanf è in grado di eguagliare l’intera stringa?

Utilizzare lo specificatore di formato %n per ottenere la posizione in cui l’elaborazione è terminata e confrontarla con la lunghezza della stringa di input, in cui l’ identificatore di formato n è definito come (dalla sezione 7.19.6.2 La funzione fscanf dello standard C99):

Nessun input è consumato. L’argomento corrispondente deve essere un puntatore al numero intero con segno in cui deve essere scritto il numero di caratteri letti dal stream 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 completamento dell’esecuzione della funzione fscanf. Nessun argomento viene convertito, ma uno viene consumato. Se la specifica di conversione include un carattere che assegna un carattere di soppressione o una larghezza del campo, il comportamento non è definito.

Per esempio:

 #include  #include  #include  int main() { const char* good_input = "\"20 21\""; const char* bad_input = "\"14 12"; int a[2]; int pos; if (sscanf(good_input, " \"%d %d\"%n", &a[0], &a[1], &pos) == 2 && pos == strlen(good_input)) { printf("good_input: %d %d\n", a[0], a[1]); } if (sscanf(bad_input, " \"%d %d\"%n", &a[0], &a[1], &pos) == 2 && pos == strlen(bad_input)) { printf("bad_input: %d %d\n", a[0], a[1]); } } 

Produzione:

 good_input: 20 21

Demo online su http://codepad.org/6G4lLXWg .