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.
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
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
funziona nel compilatore gcc nello scanf() – FossArduino