2016-01-19 12 views
24

Così ci siamo imbattuti in questo codice e non sono stato in grado di capire quale sia lo scopo di esso è, o come funziona:Che cosa significa un asterisco in un identificatore di formato scanf?

int word_count; 
scanf("%d%*c", &word_count); 

Il mio primo pensiero è stato che è stato %*d riferimento a un puntatore char o vietando word_count dal prendere le variabili char.

Qualcuno può per favore far luce su questo?

+9

Vedere: [La differenza tra% * c% c e% c] (http://stackoverflow.com/questions/11109750/the-difference-between-cc-and-c) –

+1

[** documentazione fscanf * *] (http://en.cppreference.com/w/c/io/fscanf). – edmz

risposta

19

*c significa che un carattere verrà letto ma non verrà assegnato, ad esempio per l'ingresso "30a" assegnerà 30 a word_count, ma "a" verrà ignorato.

+1

@ PeterA.Schneider vero, grazie –

22

I * in "%*c" stand per assignment-suppressing character *: Se questa opzione è presente, la funzione non assegnare il risultato della conversione ad alcun argomento ricezione. Quindi il carattere verrà letto ma non assegnato a nessuna variabile.


Note:

1. fscanf

12

per citare il C11 standard capitolo §7.21.6.2, fscanf()

[ ...] Eac La specifica di conversione h è introdotta dal carattere %. Dopo la%, appare in sequenza:

- Un carattere di soppressione di assegnazione opzionale *.
- [...]
- Un identificatore conversione carattere

e per quanto riguarda il comportamento,

[..] A meno che la soppressione incarico è stato indicato da un *, il risultato della conversione viene inserito nell'oggetto puntato dal primo argomento che segue l'argomento di formato che non ha ancora ricevuto un risultato di conversione. [...]

Ciò significa, in caso di un identificatore di formato come "%*c", un char sarà letto dal stdin ma il valore digitalizzata non vengono memorizzati o assegnato a nulla. Quindi, non è necessario fornire un parametro corrispondente.

Quindi, in questo caso,

scanf("%d%*c", &word_count); 

è un perfettamente valida dichiarazione .

Ad esempio, cosa fa in un ambiente * nix è per cancellare il buffer di ingresso dal newline che è memorizzato causa premendo ENTER chiave dopo l'ingresso.

Problemi correlati