2015-04-27 12 views
6

Cosa significa il seguente codice, in CChe cosa significa un simbolo # dopo un segno% in una funzione scanf()?

scanf("%d%#d%d",&a,&b,&c); 

se valori indicati 1 2 3 dà uscita come 1 0 0

PS- so che viene utilizzato con printf() affermazione ma qui in scanf() dichiarazione dà comportamento casuale .

+0

Qualcuno mi corregge se ho torto, ma non è il '' 'usato solo in' printf'? Ho pensato che fosse usato anteporre '0' a numeri ottali e' 0x' a esadecimale – Levi

+0

Impossibile trovarlo in nessuna pagina man di 'scanf'. Immagino che dovresti avere un avvertimento che ti dice che non esiste un tale modificatore. Compili con gli avvertimenti? E infatti @Levi, [printf man] (http://linux.die.net/man/3/printf) mostra il modificatore '#' – Eregrith

+1

funziona nel compilatore gcc nello scanf() – FossArduino

risposta

12

TL; DR; - A # dopo un segno % nella stringa di formato della funzione scanf() è un codice errato.

Spiegazione:

Il # qui è una bandiera carattere , che è consentito in fprintf() e la famiglia, non in fscanf() e la famiglia.

In caso di codice, la presenza di # dopo % viene trattato come conversione non valida specificatore. Come da 7.21.6.2,

Se una specifica di conversione non è valido, il comportamento è indefinito

Quindi, il codice produce undefined behaviour.

Suggerimento: è possibile controllare il valore return di scanf() per verificare quanti elementi sono stati "digitalizzati" correttamente.


Tuttavia, FWIW, utilizzando # con %d in printf() è anche undefined behaviour.

Solo per riferimento: Come per la C11 documento unitario, capitolo §7.21.6.1, personaggi bandiera parte, (sottolineatura mia)

#

Il risultato viene convertito in un '' forma alternativa ''. Per la conversione o, aumenta la precisione, se e solo se necessario, per forzare la prima cifra del risultato a zero (se il valore e la precisione sono entrambi 0, viene stampato un singolo 0).Per la conversione x (o X), un risultato diverso da zero ha come prefisso 0x (o 0X). Per a, A, e, E, f, F, g e G conversioni, il risultato della conversione di un numero a virgola mobile contiene sempre un carattere decimale-punto, anche se nessuna cifra seguono. (Normalmente, un risultato decimale viene visualizzato nel risultato di queste conversioni solo se una cifra lo segue.) Per le conversioni g e G, gli zero finali non vengono rimossi dal risultato . Per le altre conversioni, il comportamento non è definito.

+0

non si applica §7.21.6.1 a 'printf' invece di' scanf'? – wimh

+1

Quello che stai citando dallo standard è per le funzioni della famiglia printf, che è irrilevante qui. –

+0

@Wimmel Spiacente, ho modificato per rendere la risposta corretta. Non sono un madrelingua inglese, quindi mi incasina. –

3

Secondo the Standard, l'uso di # è illegale.

Its use makes your program invoke Undefined Behaviour.

Naturalmente, se l'implementazione lo definisce, è definito il comportamento per l'implementazione e fa quello la documentazione dice.

+1

che cosa fa? – FossArduino

+2

[Se una specifica di conversione non è valida, il comportamento non è definito.] (Http://port70.net/~nsz/c/c11/n1570.html#7.21.6.2p13) – wimh

Problemi correlati