logo

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 datiformato: 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 datiformato: 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