Nel linguaggio C, scanf() la funzione viene utilizzata per leggere l'input formattato da stdin. Restituisce il numero intero di caratteri scritti al suo interno altrimenti restituisce un valore negativo.
Sintassi:
int scanf(const char *characters_set)>
Complessità temporale: SU)
Spazio ausiliario: O(n) dove n è la lunghezza dell'input.
Molti di noi conoscono gli usi tradizionali di scanf. Bene, ecco alcuni dei fatti meno noti
10 su 100
Come leggere solo una parte dell'input di cui abbiamo bisogno?
Ad esempio, considera un flusso di input che contiene solo caratteri seguiti da un numero intero o un float. E dobbiamo scansionare solo quel numero intero o float.
Esempio:
Input : 'this is the value 100', Output : value read is 100 Input : 'this is the value 21.2', Output : value read is 21.2>C
// C program to demonstrate that // we can ignore some string // in scanf() #include int main() { int a; scanf('This is the value %d', &a); printf('Input value read : a = %d', a); return 0; } // Input : This is the value 100>
Supponiamo ora di non sapere quali siano i caratteri precedenti ma di sapere sicuramente che l'ultimo valore è un numero intero. Come possiamo scansionare l'ultimo valore come numero intero?
La soluzione seguente funziona solo se la stringa di input non contiene spazi. Per esempio,
Ingresso
'blablabla 25'>C
// C program to demonstrate use of *s #include int main() { int a; scanf('%*s %d', &a); printf('Input value read : a=%d', a); return 0; }> Produzione
Input Value read : 25>
Spiegazione : %*s in scanf viene utilizzato per ignorare alcuni input come richiesto. In questo caso, ignora l'input fino allo spazio o al ritorno a capo successivi. Allo stesso modo, se scrivi %*d ignorerà gli interi fino al successivo spazio o nuova riga.
Uso generale di scanf():
C // C program to demonstrate general use of scanf() #include int main() { int a; scanf('%d', &a); printf('a = %d', a); return 0; }> Ingresso
2>
Produzione
a = 2>
Il fatto di cui sopra potrebbe non sembrare un trucco utile a prima vista. Per comprenderne l'utilizzo, vediamo prima fscanf().
Funzione fscanf in C
Stanco di tutta la sintassi goffa per leggere dai file? beh, fscanf viene in soccorso. Questa funzione viene utilizzata per leggere l'input formattato dal flusso specificato nel linguaggio C.
Sintassi:
int fscanf(FILE *ptr, const char *format, ...)>
fscanf legge da un file puntato dal puntatore FILE (ptr), invece di leggere dal flusso di input.
Valore di ritorno: Restituisce zero o EOF, se non ha successo. Altrimenti restituisce il numero di elementi assegnati con successo.
Complessità temporale: SU)
Spazio ausiliario: O(n) dove n è la lunghezza dell'input.
Esempio 1: Considera il seguente file di testo abc.txt
NAME AGE CITY abc 12 hyderabad bef 25 delhi cce 65 bangalore>
Ora vogliamo leggere solo il campo città del file di testo sopra, ignorando tutti gli altri campi. Una combinazione di fscanf e del trucco menzionato sopra fa questo con facilità
proprietà acide nei DBMSC
// C Program to demonstrate fscanf #include // Driver Code int main() { FILE* ptr = fopen('abc.txt', 'r'); if (ptr == NULL) { printf('no such file.'); return 0; } /* Assuming that abc.txt has content in below format NAME AGE CITY abc 12 hyderabad bef 25 delhi cce 65 bangalore */ char buf[100]; while (fscanf(ptr, '%*s %*s %s ', buf) == 1) printf('%s
', buf); return 0; }> Produzione
CITY hyderabad delhi bangalore>
Esempio 2: Considera il seguente file binario program.bin
n1 n2 n3 1 5 6 2 10 11 3 15 16 4 20 21>
Per leggere tutti i valori di n1, n2 e n3 del contenitore, utilizziamo fscanf()
C #include #include struct threeNum{ int n1, n2, n3; }; int main(){ int n; struct threeNum num; FILE *fptr; if ((fptr = fopen('program.bin','rb')) == NULL){ printf('Error! opening file'); // Program exits if the file pointer returns NULL. exit(1); } for(n = 1; n < 5; ++n){ fread(&num, sizeof(struct threeNum), 1, fptr); printf('n1: %d n2: %d n3: %d', num.n1, num.n2, num.n3); } fclose(fptr); return 0; } //Code submitted by Susobhan Akhuli> Produzione
n1: 1 n2: 5 n3: 6 n1: 2 n2: 10 n3: 11 n1: 3 n2: 15 n3: 16 n1: 4 n2: 20 n3: 21>
Vediamo le differenze in forma tabellare:
| scanf() | fscanf() | |
| 1. | Viene utilizzato per leggere l'input standard. | Questa funzione viene utilizzata per leggere l'input da un file |
| 2. | La sua sintassi è -: scanf(const carattere *formato, …) | La sua sintassi è -: fscanf(FILE *stream, const char *format, …) |
| 3. | Richiede che gli specificatori di formato ricevano input di un tipo particolare. | Legge il flusso sotto forma di byte |
| 4. | Sono necessari tre parametri: Carattere di spazio bianco, carattere non di spazio bianco, identificatori di formato è uguale a Java | È definito nel file di intestazione #include |