2025 Autore: Howard Calhoun | [email protected]. Ultima modifica: 2025-01-24 13:19
In questo articolo, la funzione scanf() è considerata in una forma generale senza riferimento a uno standard specifico, quindi i dati di qualsiasi standard C99, C11, C++11, C++14 sono inclusi qui. Forse, in alcuni standard, la funzione funziona con differenze rispetto al materiale presentato nell'articolo.
Funzione di scansione C - descrizione
scanf() è una funzione che si trova nei file di intestazione stdio.h(C) e cstdio(C++), nota anche come input di programma formattato. scanf legge i caratteri dal flusso di input standard (stdin) e li converte in base al formato, quindi li scrive nelle variabili specificate. Formato: significa che i dati vengono convertiti in una determinata forma al momento della ricezione. Pertanto, viene descritta la funzione scanf C:
scanf("%format", &variable1[, &variable2, […]), dove le variabili vengono passate come indirizzi. Il motivo di questo modo di passare variabili a una funzione è ovvio: come risultato del lavoro, restituisce un valore che indica la presenza di errori, quindil'unico modo per modificare i valori delle variabili è passare per indirizzo. Inoltre, grazie a questo metodo, la funzione può elaborare dati di qualsiasi tipo.
Alcuni programmatori si riferiscono a funzioni come scanf() o printf() come procedure a causa dell'analogia con altri linguaggi.
Scanf consente l'input di tutti i tipi di linguaggio di base: char, int, float, string, ecc. Nel caso di variabili di tipo string, non è necessario specificare il segno dell'indirizzo - "&", poiché la variabile di tipo string è un array e il suo nome è l'indirizzo del primo elemento dell'array nella memoria del computer.

Formato di immissione dati o stringa di controllo
Inizia guardando l'esempio della funzione scanf C dalla descrizione.
include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); restituire 0; //requisito per sistemi Linux }
Il formato di input è costituito dai seguenti quattro parametri: tipo %[width][modifiers]. In questo caso, il segno "%" e il tipo sono parametri obbligatori. Cioè, il formato minimo è simile a questo: “%s”, “%d” e così via.
In generale, i caratteri che compongono la stringa di formato sono divisi in:
- specificatori di formato - qualsiasi cosa che inizi con %;
- caratteri di separazione o spazi - sono spazio, tabulazione(t), newline (n);
- caratteri diversi da spazi bianchi.
La funzione potrebbe non essere sicura.
Usa scanf_s() invece di scanf().
(messaggio da Visual Studio)
Digita o specificatori di formato o caratteri di conversione o caratteri di controllo

Una dichiarazione scanf C deve contenere almeno un identificatore di formato, specificato alla fine delle espressioni che iniziano con "%". Indica al programma il tipo di dati da aspettarsi durante l'immissione, solitamente dalla tastiera. Elenco di tutti gli specificatori di formato nella tabella seguente.
Tipo |
Significato | |
1 | %c | Il programma attende l'inserimento di un carattere. La variabile da scrivere deve essere del tipo di carattere char. |
2 | %d | Il programma prevede l'immissione di un numero decimale di tipo intero. La variabile deve essere di tipo int. |
3 | %i | Il programma prevede l'immissione di un numero decimale di tipo intero. La variabile deve essere di tipo int. |
4 | %e, %E | Il programma prevede di inserire un numero in virgola mobile (virgola) in forma esponenziale. La variabile deve essere di tipo float. |
5 | %f | Il programma prevede un numero in virgola mobile (virgola). La variabile deve essere di tipo float. |
6 | %g, %G | Il programma prevede un numero in virgola mobile (virgola). La variabile deve essere di tipo float. |
7 | %a | Il programma prevede un numero in virgola mobile (virgola). La variabile deve essere di tipo float. |
8 | %o | Il programma prevede un numero ottale. La variabile deve essere di tipo int. |
9 | %s | Il programma attende l'immissione di una stringa. Una stringa è un insieme di caratteri fino al primo carattere separatore incontrato. La variabile deve essere di tipo string. |
10 | %x, %X | Il programma è in attesa di un numero esadecimale. La variabile deve essere di tipo int. |
11 | %p | La variabile prevede l'input del puntatore. La variabile deve essere di tipo puntatore. |
12 |
%n | Scrive in una variabile un valore intero uguale al numero di caratteri letti finora dalla funzione scanf. |
13 | %u | Il programma legge un intero senza segno. Il tipo di variabile deve essere intero senza segno. |
14 | %b | Il programma è in attesa di un numero binario. La variabile deve essere di tipo int. |
15 | % | Set di caratteri scansionato. Il programma attende l'inserimento dei caratteri.dal pool limitato specificato tra parentesi quadre. scanf funzionerà finché ci sono caratteri dal set specificato nel flusso di input. |
16 | %% | Segna "%". |
Caratteri nel formato stringa

Simbolo stella ()
L'asterisco () è un flag che indica che l'operazione di assegnazione deve essere soppressa. Un asterisco viene posizionato subito dopo il segno "%". Ad esempio,
scanf("%d%c%d", &x, &y); //ignora il carattere tra due numeri interi. scanf("%s%d%s", str, str2); //ignora il numero intero tra due stringhe.
Ovvero, se inserisci la riga "45-20" nella console, il programma eseguirà le seguenti operazioni:
- Alla variabile "x" verrà assegnato il valore 45.
- Alla variabile "y" verrà assegnato il valore 20.
- E il segno meno (trattino) "-" verrà ignorato grazie a "%c".
Larghezza (o larghezza campo)
Questo è un numero intero compreso tra il segno "%" e l'identificatore di formato che specifica il numero massimo di caratteri da leggere nell'operazione di lettura corrente.
scanf("%20s", str); //leggi i primi 20 caratteri dallo stream di input
Ci sono alcune cose importanti da tenere a mente:
- scanf terminerà se incontra un carattere separatore, anche se non contava 20 caratteri.
- Se vengono inseriti più di 20 caratteri, solo i primi 20 caratteri verranno scritti in str.
Modificatoritipo (o precisione)

Questi sono flag speciali che modificano il tipo di dati previsto per l'input. Il flag è specificato a sinistra dell'identificatore di tipo:
- L o l (L piccola) Quando "l" è usato con gli specificatori d, i, o, u, x, il flag indica al programma che è previsto un input long int. Quando si usa "l" con l'identificatore e o f, il flag indica al programma che dovrebbe aspettarsi un valore doppio. L'uso di "L" indica al programma che è previsto un doppio lungo. L'uso di "l" con gli identificatori "c" e "s" indica al programma che sono previsti caratteri a due byte come wchar_t. Ad esempio, "%lc", "%ls", "%l[asd]".
- h è una bandiera che indica il tipo breve.
- hh - indica che la variabile è un puntatore a un carattere con segno oa un valore di carattere senza segno. Il flag può essere utilizzato con gli specificatori d, i, o, u, x, n.
- ll (due L piccole) - indica che la variabile è un puntatore a un valore di tipo firmato long long int o unsigned long long int. Il flag viene utilizzato con gli specificatori: d, i, o, u, x, n.
- j - indica che la variabile è un puntatore al tipo intmax_t o uintmax_t dal file di intestazione stdint.h. Usato con specificatori: d, i, o, u, x, n.
- z - indica che la variabile è un puntatore al tipo size_t, la cui definizione è in stddef.h. Usato con specificatori: d, i, o, u, x, n.
- t - indica che la variabile è un puntatore al tipo ptrdiff_t. Definizione attivaquesto tipo è in stddef.h. Usato con specificatori: d, i, o, u, x, n.
Più chiaramente, l'immagine con i modificatori può essere rappresentata come una tabella. Una tale descrizione di scanf C per i programmatori sarà più chiara.

Altri personaggi
Tutti i caratteri incontrati nel formato verranno scartati. Allo stesso tempo, va notato che la presenza di spazi bianchi o caratteri di separazione (nuova riga, spazio, tabulazione) nella stringa di controllo può portare a comportamenti diversi della funzione. In una versione, scanf() leggerà senza salvare alcun numero di separatori finché non incontra un carattere diverso dal separatore e in un' altra versione, gli spazi (solo loro) non svolgono un ruolo e l'espressione "%d + %d" è equivalente a "% d+%d".

Esempi
Diamo un'occhiata ad alcuni esempi per aiutarti a pensare e capire meglio come funziona la funzione.
scanf("%3s", str); //se inserisci la stringa "1d2s3d1;3" nella console, solo "1d2" verrà scritto in str scanf("%dminus%d", &x, &y); //i caratteri meno tra due numeri verranno eliminati scanf("%5[0-9]", str); // i caratteri verranno inseriti in str fino a quando non ci saranno 5 caratteri e i caratteri saranno numeri da 0 a 9. scanf("%lf", &d); //prevedo un doppio input scanf("%hd", &x); //numero previsto di tipo short scanf("%hu", &y); //aspetta un numero senza segno short scanf("lx", &z); //numero previsto di tipo long int
DaGli esempi seguenti mostrano come cambia il numero atteso utilizzando simboli diversi.
scanf C - descrizione per principianti
Questa sezione sarà utile per i principianti. Spesso è necessario avere a portata di mano non tanto una descrizione completa di scanf C quanto i dettagli di come funziona la funzione.
- Questa funzione è in qualche modo obsoleta. Esistono diverse implementazioni in librerie di versioni diverse. Ad esempio, la funzione scanf SC migliorata, la cui descrizione può essere trovata sul sito Web di Microsoft.
- Il numero di specificatori nel formato deve corrispondere al numero di argomenti passati alla funzione.
- Gli elementi del flusso di input devono essere separati solo da caratteri separatori: spazio, tabulazione, nuova riga. Virgola, punto e virgola, punto, ecc. - questi caratteri non sono separatori per la funzione scanf().
- Se scanf incontra un carattere separatore, l'input verrà interrotto. Se c'è più di una variabile da leggere, scanf passerà alla lettura della variabile successiva.
- La minima incoerenza nel formato dei dati di input porta a risultati imprevedibili del programma. Bene, se il programma finisce con un errore. Ma spesso il programma continua a funzionare e lo fa male.
- scanf("%20s …", …); Se il flusso di input supera i 20 caratteri, scanf leggerà i primi 20 caratteri e interromperà o passerà alla lettura della variabile successiva, se specificata. In questo caso, la chiamata successiva a scanf continuerà a leggere il flusso di input dal punto in cui il lavoro della precedente chiamata a scanf si è interrotto. Se durante la lettura dei primi 20caratteri, viene rilevato un carattere delimitatore, scanf interromperà o continuerà a leggere la variabile successiva, anche se non ha letto 20 caratteri per la prima variabile. In questo caso, tutti i caratteri non letti verranno allegati alla variabile successiva.
- Se il set di caratteri scansionati inizia con un "^", scanf leggerà i dati finché non incontra un carattere delimitatore o un carattere del set. Ad esempio, "%[^A-E1-5]" leggerà i dati dal flusso finché non incontra uno dei caratteri inglesi maiuscoli da A a E o uno dei numeri da 1 a 5.
- La funzione scanf C, come descritto, restituisce un numero uguale al numero di scritture riuscite sulle variabili. Se scanf scrive 3 variabili, il risultato positivo della funzione restituirà il numero 3. Se scanf non è in grado di scrivere alcuna variabile, il risultato sarà 0. E, infine, se scanf non può iniziare affatto per qualche motivo, il il risultato sarà EOF.
- Se la funzione scanf() è terminata in modo errato. Ad esempio, scanf("%d", &x) - era previsto un numero, ma i caratteri sono stati ricevuti come input. La successiva chiamata scanf() inizierà nel punto nel flusso di input in cui è terminata la precedente chiamata alla funzione. Per superare questo problema, è necessario sbarazzarsi dei personaggi problematici. Questo può essere fatto, ad esempio, chiamando scanf("%s"). Cioè, la funzione leggerà una stringa di caratteri e la getterà via. In questo modo complicato, puoi continuare a inserire i dati necessari.
- In alcune implementazioni di scanf(), "-" non è consentito nel set di caratteri scansionato.
- Lo specificatore "%c" legge ogni carattere dallo stream. Cioè, legge anche il carattere separatore. Per s altare il carattere delimitatore e continuare a leggere il carattere desiderato, puoi usare "%1s".
- Quando si usa lo specificatore "c", è consentito usare la larghezza "%10c", ma poi un array di elementi di tipo char deve essere passato come variabile alla funzione scanf.
- "%[a-z]" significa "tutte le lettere minuscole dell'alfabeto inglese" e "%[z-a]" significa solo 3 caratteri: 'z', 'a', '-'. In altre parole, il carattere "-" indica un intervallo solo se è compreso tra due caratteri nell'ordine corretto. Se "-" è alla fine di un'espressione, all'inizio o nell'ordine errato dei caratteri su entrambi i lati, è solo un trattino, non un intervallo.

Conclusione
Questo conclude la descrizione di scanf C. Questa è una caratteristica utile per lavorare con piccoli programmi e quando si usa il metodo di programmazione procedurale. Tuttavia, lo svantaggio principale è il numero di errori imprevedibili che possono verificarsi quando si utilizza scanf. Pertanto, la descrizione di scanf C durante la programmazione è meglio tenerla davanti agli occhi. Nei grandi progetti professionali, vengono utilizzati iostream, poiché hanno capacità di livello superiore, sono in grado di rilevare e gestire meglio gli errori e funzionano anche con quantità significative di informazioni. Va anche notato che la descrizione di scanf C in russo è disponibile su molte fonti di rete, oltre a esempi di essauso, a causa dell'età della funzione. Pertanto, se necessario, puoi sempre trovare la risposta sui forum tematici.
Consigliato:
Funzione di controllo delle tasse: descrizione ed esempi

Cosa sono le tasse? Caratteristiche ed esempi delle loro funzioni: di controllo, sociale (redistributivo), regolatorio, fiscale. Quali sottofunzioni spiccano qui? Qual è la funzione di incentivazione aggiuntiva? Quali sono i controlli e le altre funzioni del Servizio fiscale federale?
Qual è la parte finanziata e assicurativa della pensione? Il termine per il trasferimento della parte finanziata della pensione. Quale parte della pensione è assicurata e quale è f

In Russia la riforma delle pensioni è in vigore da molto tempo, poco più di un decennio. Nonostante ciò, molti cittadini lavoratori ancora non riescono a capire quale sia la parte finanziata e assicurativa di una pensione e, di conseguenza, quale importo di sicurezza li attende nella vecchiaia. Per comprendere questo problema, è necessario leggere le informazioni presentate nell'articolo
Rimborso sulla carta al momento della restituzione della merce: termini, descrizione della procedura, consigli

Negli ultimi anni, c'è stata una tendenza abbastanza costante in tutto il mondo ad aumentare il numero di persone che preferiscono pagare i loro piccoli e grandi acquisti tramite bonifico bancario. Pertanto, non sorprende che molti consumatori moderni siano interessati a come e in quali termini il denaro viene restituito alla carta al momento della restituzione della merce. Dopo aver letto questo articolo, imparerai le principali sfumature di questa procedura
Valuta della Tanzania: valore nominale e reale, possibili acquisti, storia della creazione, autore del disegno della banconota, descrizione e foto

L'articolo parla della valuta nazionale dello stato africano della Tanzania. Contiene informazioni sulla storia della valuta, il suo tasso in relazione ad altre banconote, il valore reale, nonché una descrizione e fatti interessanti a riguardo
Conigli della razza Strokach: descrizione della specie, caratteristiche di cura, riproduzione, caratteristiche della razza e regole di allevamento

Se qualcuno ha l'obiettivo di allevare conigli della razza Strokach, allora è necessario ricordare che è meglio avere solo gli individui più forti e migliori della razza tedesca. Quando vengono coltivati in casa, molti agricoltori non sempre riescono ad allevare una razza pura, poiché alcuni individui sono variegati o si ammalano