2015-06-10 11 views
5

Ho recentemente scritto un semplice programma in cui per errore uso scanf() invece di printf() per visualizzare un messaggio su console. Mi aspettavo di ottenere errore in fase di compilazione, ma compila bene senza avvisi & arresti anomali in fase di esecuzione. So che scanf() è usato per prendere input dalla tastiera. Non dovrei ricevere un errore nel seguente programma?Perché passare una stringa a scanf() si compila bene in C?

#include <stdio.h> 
int main() 
{ 
    scanf("Hello world"); // oops, It had to be printf() 
    return 0; 
} 

E 'invoca comportamento non definito (UB)? C'è qualche menzione a riguardo nello standard C? Perché non viene controllato in fase di compilazione se gli argomenti validi & validi vengono passati alla funzione scanf() o no?

+0

Impossibile riprodurre arresto anomalo. Il programma funziona bene per me. – EOF

+0

Il codice mi sembra corretto e dovrebbe essere completato normalmente una volta compilato ed eseguito. Come fai a sapere che si "blocca"? Quali sono i sintomi di incidente? – CiaPan

+1

Sono abbastanza sicuro che la grammatica implicita: senza riuscire a compilare e * senza * crashing –

risposta

6

Il codice funziona correttamente. Infatti, scanf è dichiarato

int scanf(const char *format, ...); 

Per fortuna, il tuo format non contiene alcuna % per il quale non ci sarebbe alcuna corrispondenza nella ..., che sarebbe richiamare UB.
Inoltre, format è una stringa letterale che consente al compilatore di passare attraverso di essa assicurando di aver passato il giusto tipo di parametri rispetto agli specificatori di formato, come parte dei controlli di integrità abilitati con livelli di avviso più elevati. (Famiglia -Wformat)

-1

scanf does take a string paramater. Ecco perché compila bene, ma sembra che il tuo parametro non corrisponda a quello che si aspetta, quindi si blocca (o semplicemente esce) in fase di runtime.

+4

dubito davvero che si blocchi ... Perché dovrebbe? 'scanf' legge solo caratteri dall'input e li confronta con la stringa di formato. Quando il confronto fallisce, 'scanf' ritorna con qualche errore - ma non 'crash'. – CiaPan

4

Il compilatore non può leggere la tua mente.

Entrambi printf("Hello world") e scanf("Hello world") sono ben formati.

6

passaggio di una stringa di scanf compila bene, perché scanfaspetta una stringa come primo parametro. Consultare la documentazione o il manuale di programmazione per la descrizione dettagliata scanf.

Problemi correlati