Funzioni di libreria integrate per l'input dell'utente | sscanf, scanf_s, fscanf_s, sscanf_s

Il linguaggio di programmazione C fornisce varie funzioni di libreria integrate per l'input dell'utente. In questo articolo impareremo a conoscere sscanf scanf_s fscanf_s sscanf_s Funzioni di libreria in C.

1. Funzione sscanf() in C

sscanf() viene utilizzato per leggere l'input formattato dalla stringa. Entrambe le funzioni scanf() e sscanf() sono simili, l'unica differenza tra loro è che la funzione scanf() legge l'input dell'utente dall'input standard come una tastiera e la funzione sscanf() legge l'input da una stringa e memorizza l'input in un'altra stringa.

Sintassi

int   sscanf   ( const char *   str   const char *   format   ...); 

Parametri

    stra : Stringa di input da cui vogliamo leggere i dati. formato : una stringa che contiene gli identificatori di tipo. … (puntini di sospensione) : Indica che la funzione accetta un numero variabile di argomenti.

Valore restituito

  • In caso di successo la funzione restituisce il numero di valori letti con successo.
  • Nel caso di un errore di input prima che i dati possano essere letti con successo, viene restituito EOF.

Nota : Dovrebbero esserci almeno tanti argomenti quanti sono i valori memorizzati dagli identificatori di formato.

Esempio: programma C per illustrare la funzione sscanf

C
   // C program to illustrate sscanf statement   #include         int     main  ()   {      // declaring array s      char     s  []     =     '3 red balls 2 blue balls'  ;      char     str  [  10  ]     str2  [  10  ];      int     i  ;      // %*s is used to skip a word      sscanf  (  s       '%d %*s %*s %*s %s %s'       &  i       str       str2  );      printf  (  '%d %s %s   n  '       i       str       str2  );      return     0  ;   }   

Produzione
3 blue balls  

2. Funzione scanf_s() in C

Questa funzione è specifica dei compilatori Microsoft. È uguale a scanf tranne che non causa un sovraccarico del buffer. La funzione scanf_s() è più sicura della funzione scanf() poiché fornisce un parametro aggiuntivo per specificare la dimensione del buffer che può evitare l'overflow del buffer.

Sintassi

int   scanf_s  (const char *format [argument]...); 

Parametri

    flusso : puntatore all'oggetto File che identifica lo stream. formato : è una stringa che contiene gli identificatori di tipo. … (puntini di sospensione) : Indica che la funzione accetta un numero variabile di argomenti.

Nota : Qui possiamo specificare la dimensione del buffer e controllare effettivamente il limite dell'input in modo che l'intera applicazione non si blocchi a causa di un overflow della memoria.

Valore restituito

  • In caso di successo la funzione restituisce il numero di valori letti.
  • Nel caso di un errore di input prima che i dati possano essere letti con successo, viene restituito EOF.

Perché usare scanf_s()?

scanf legge semplicemente qualunque input venga fornito dalla console. C non controlla se l'input dell'utente si adatterà alla variabile che hai designato. Se hai un array chiamato color[3] e usi scanf per la stringa Red funzionerà correttamente, ma se l'utente inserisce più di 3 caratteri scanf inizia a scrivere nella memoria che non appartiene all'array color.

C non lo noterà né ti avviserà e potrebbe o meno bloccare il programma a seconda che qualcosa tenti di accedere e scrivere su quello slot di memoria che non appartiene all'array di colori. È qui che entra in gioco scanf_s. scanf_s controlla che l'input dell'utente si adatti allo spazio di memoria specificato.

Nota : scanf_s() funzionerà solo in Microsoft Visual Studio.

Esempio 1: programma C per illustrare la funzione sscanf_s

C
   // C program to illustrate sscanf_s statement   // scanf_s() will only work in Microsoft Visual Studio.   #include         #include         int     main  ()   {      char     a  [  5  ];      // sizeof(a) is buffer size      scanf_s  (  '%s'       a       sizeof  (  a  ));      printf  (  '  n  %s '       a  );      return     0  ;   }   


Ingresso 1

Red 

Uscita 1

Red 

Ingresso 2

Yellow 

Uscita 2

No Output 

Esempio 2: programma C per illustrare la relazione tra la dimensione del buffer e la dimensione dell'array.

C++
   // C++ program   // consumes the Enter key   // (newline character) pressed after input   #include         int     main  ()   {      // example      char     ch  [  100000  ];      printf  (  'Enter characters: '  );      scanf_s  (  '%s'       ch       99999  );      getchar  ();      return     0  ;   }   
C
   // C program   // consumes the Enter key   // (newline character) pressed after input   #include         int     main  ()   {      char     ch  [  100000  ];      printf  (  'Enter characters: '  );      scanf_s  (  '%s'       ch       99999  );      getchar  ();      return     0  ;   }   
  • Se la dimensione del buffer è uguale o inferiore alla dimensione dell'array, l'immissione di una dimensione maggiore o uguale alla dimensione del buffer porterà alla perdita di dati poiché i dati in eccesso verranno troncati e verranno letti i dati fino alla dimensione del buffer - 1.
  • Se la dimensione del buffer è maggiore della dimensione di un array, allora
    • l'immissione di dimensioni inferiori alla dimensione del buffer funzionerà ma genererà un errore
    • l'immissione di dimensioni maggiori della dimensione del buffer porterà all'overflow del buffer e genererà lo stesso errore.

3. Funzione fscanf_s() in C

La differenza tra fscanf() e fscanf_s() è la stessa di scanf() e scanf_s(). fscanf_s() è una funzione sicura che richiede che la dimensione di ciascun campo di tipo c C s S e [ ] venga passato come argomento immediatamente dopo la variabile.

Sintassi

int fscanf_s( FILE *stream const char *format [argument ]... ); 

Parametri

    stra : stringa utilizzata per recuperare i dati formato : stringa che contiene gli identificatori di tipo … (puntini di sospensione) : Indica che la funzione accetta un numero variabile di argomenti.

Nota : fscanf_s ha un parametro aggiuntivo per specificare la dimensione del buffer e controllare effettivamente il limite dell'input.

Valore restituito

  • In caso di successo la funzione restituisce il numero di valori letti con successo.
  • Nel caso di un errore di input prima che i dati possano essere letti con successo, viene restituito EOF.

Nota : fscanf_s funzionerà solo in MS Visual Studio.

Esempio: programma C per illustrare la funzione fscanf_s

C
   // C program to illustrate fscanf_s statement   // This program will run on MS Visual studio   #include         #include         int     main  ()   {      char     s1  [  10  ]     s2  [  10  ]     s3  [  10  ];      int     year  ;      // file pointer      FILE  *     fp  ;      // Open file securely      fopen_s  (  &  fp       'file.txt'       'w+'  );      fputs  (  'Hello World its 2017'       fp  );      rewind  (  fp  );      // Using fscanf_s      fscanf_s  (  fp       '%s'       s1       sizeof  (  s1  ));      fscanf_s  (  fp       '%s'       s2       sizeof  (  s2  ));      fscanf_s  (  fp       '%s'       s3       sizeof  (  s3  ));      fscanf_s  (  fp       '%d'       &  year       sizeof  (  year  ));      printf  (  'String1 |%s|  n  '       s1  );      printf  (  'String2 |%s|  n  '       s2  );      printf  (  'String3 |%s|  n  '       s3  );      printf  (  'Integer |%d|  n  '       year  );      fclose  (  fp  );      return     (  0  );   }   


Produzione

String1 |Hello| String2 |World| String3 |its| Integer |2017| 

4. Funzione sscanf_s() in C

sscanf_s() è una funzione sicura di sscanf() e le funzioni sicure richiedono che la dimensione di ciascun campo di tipo c C s S e [ venga passato come argomento immediatamente dopo la variabile.

Sintassi

int   sscanf_s  (const char *  restrict buffer   const char *  restrict format   ...); 

Parametri

    stra : stringa utilizzata per recuperare i dati formato : stringa che contiene gli identificatori di tipo … (puntini di sospensione) : Indica che la funzione accetta un numero variabile di argomenti.

Nota : sscanf_s ha un parametro aggiuntivo per specificare la dimensione del buffer e controllare effettivamente il limite dell'input.

Valore restituito

  • In caso di successo la funzione restituisce il numero di valori letti con successo.
  • Nel caso di un errore di input prima che i dati possano essere letti con successo, viene restituito EOF.

Nota : sscanf_s() funzionerà solo in Microsoft Visual Studio.

Esempio: programma C per illustrare la funzione sscanf_s

C
   // C program to illustrate sscanf_s statement   // This program will run on MS Visual studio   #include         int     main  ()   {      char     s  []     =     '3 red balls 2 blue balls'  ;      char     str  [  10  ]     str2  [  10  ];      int     i  ;      // %*s is used to skip a word      sscanf_s  (  s       '%d'       &  i       sizeof  (  i  ));      sscanf_s  (  s       '%*d %*s %*s %*s %s'       str       sizeof  (  str  ));      sscanf_s  (  s       '%*d %*s %*s %*s %*s %s'       str2        sizeof  (  str2  ));      printf  (  '%d %s %s   n  '       i       str       str2  );      return     0  ;   }   


Produzione

3 blue balls 

Crea quiz