Rendere fscanf Ignora parametro opzionale
Domanda
Sto usando fscanf per leggere un file che ha righe come
Numero & Lt; -whitespace - & Gt; stringa < -whitespace - > optional_3rd_column
Desidero estrarre il numero e la stringa da ogni colonna, ma ignoro la terza colonna se esiste
Dati di esempio:
12 pippo qualcosa
03 bar
24 qualcosa #compressione casuale
Vorrei estrarre 12, pippo; 03, bar; 24, qualcosa ignorando & Quot; qualcosa & Quot; e " #randomcomment "
Al momento ho qualcosa come
while(scanf("%d %s %*s",&num,&word)>=2)
{
assign stuff
}
Tuttavia, ciò non funziona con le linee senza la terza colonna. Come posso fare in modo che ignori tutto dopo la seconda stringa?
Soluzione
Mi sembra che la soluzione più semplice sia scanf ("% d% s " ;, & amp; num, & amp; word) e quindi fgets () per mangiare il resto della fila.
Altri suggerimenti
Il problema è che %*s
sta mangiando il numero sulla riga successiva quando non c'è la terza colonna, e quindi il prossimo %d
non riesce perché il token successivo non è un numero. Per risolverlo senza usare gets()
seguito da sscanf()
, puoi usare la classe di caratteri specificata:
while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{
assign stuff
}
Il [^\n]
dice di abbinare il maggior numero possibile di caratteri che non sono newline e il *
sopprime il compito di prima. Si noti inoltre che non è possibile inserire uno spazio tra %s
e %*[\n]
, poiché altrimenti lo spazio nella stringa di formato corrisponderebbe alla nuova riga, facendo sì che <=> corrisponda all'intera riga successiva, che non è ciò che vuoi.
Usa fgets () per leggere una riga alla volta e poi usa sscanf () per cercare le due colonne che ti interessano, più robuste e non devi fare nulla di speciale per ignorare i dati finali.
Uso spesso gets () seguito da uno sscanf () sulla stringa che hai appena, ehm,
Bonus: puoi separare il test per la fine dell'input dall'analisi.