Descrizione della funzione Scanf C
Descrizione della funzione Scanf C

Video: Descrizione della funzione Scanf C

Video: Descrizione della funzione Scanf C
Video: La moneta nella Storia con Passione Monete 2024, Novembre
Anonim

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.

Utilizzo del C in C++
Utilizzo del C in C++

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

codice binario
codice binario

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

codice C++
codice C++

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:

  1. Alla variabile "x" verrà assegnato il valore 45.
  2. Alla variabile "y" verrà assegnato il valore 20.
  3. 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:

  1. scanf terminerà se incontra un carattere separatore, anche se non contava 20 caratteri.
  2. Se vengono inseriti più di 20 caratteri, solo i primi 20 caratteri verranno scritti in str.

Modificatoritipo (o precisione)

codice splash
codice splash

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.

Specificatori e modificatori di tipo
Specificatori e modificatori di tipo

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".

Esempio di codice C++
Esempio di codice C++

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.
codice C++
codice C++

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: