Funções de biblioteca integradas para entrada do usuário | sscanf, scanf_s, fscanf_s, sscanf_s

A linguagem de programação C fornece várias funções de biblioteca integradas para entrada do usuário. Neste artigo aprenderemos sobre as funções da biblioteca sscanf scanf_s fscanf_s sscanf_s em C.

1. Função sscanf() em C

sscanf() é usado para ler a entrada formatada da string. Ambas as funções scanf() e sscanf() são semelhantes, a única diferença entre elas é que a função scanf() lê a entrada do usuário a partir da entrada padrão como um teclado e a função sscanf() lê a entrada de uma string e armazena a entrada em outra string.

Sintaxe

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

Parâmetros

    str : String de entrada da qual queremos ler os dados. formatar : uma string que contém os especificadores de tipo. … (reticências) : Indica que a função aceita um número variável de argumentos.

Valor de retorno

  • Em caso de sucesso, a função retorna o número de valores lidos com sucesso.
  • No caso de uma falha de entrada antes que qualquer dado possa ser lido com êxito, o EOF é retornado.

Observação : deve haver pelo menos tantos argumentos quanto o número de valores armazenados pelos especificadores de formato.

Exemplo: Programa C para ilustrar a função 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  ;   }   

Saída
3 blue balls  

2. Função scanf_s() em C

Esta função é específica para compiladores Microsoft. É o mesmo que scanf, exceto que não causa sobrecarga de buffer. A função scanf_s() é mais segura do que a função scanf(), pois fornece um parâmetro adicional para especificar o tamanho do buffer que pode evitar estouro de buffer.

Sintaxe

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

Parâmetros

    fluxo : ponteiro para o objeto File que identifica o stream. formatar : é uma string que contém o(s) especificador(es) de tipo. … (reticências) : Indica que a função aceita um número variável de argumentos.

Observação : Aqui podemos especificar o tamanho do buffer e realmente controlar o limite da entrada para que todo o aplicativo não trave devido ao excesso de memória.

Valor de retorno

  • Em caso de sucesso, a função retorna o número de valores lidos.
  • No caso de uma falha de entrada antes que qualquer dado possa ser lido com êxito, o EOF é retornado.

Por que usar scanf_s()?

scanf apenas lê qualquer entrada fornecida pelo console. C não verifica se a entrada do usuário caberá na variável que você designou. Se você tiver um array chamado color[3] e usar scanf para a string Red, ele funcionará bem, mas se o usuário inserir mais de 3 caracteres, scanf começará a gravar na memória que não pertence ao array de cores.

C não detectará isso ou avisará você e poderá ou não travar o programa, dependendo se algo tentar acessar e gravar naquele slot de memória que não pertence ao array de cores. É aqui que o scanf_s entra em ação. scanf_s verifica se a entrada do usuário caberá no espaço de memória fornecido.

Observação : scanf_s() funcionará apenas no Microsoft Visual Studio.

Exemplo 1: Programa C para ilustrar a função 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  ;   }   


Entrada 1

Red 

Saída 1

Red 

Entrada 2

Yellow 

Saída 2

No Output 

Exemplo 2: Programa C para ilustrar a relação entre o tamanho do buffer e o tamanho do 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 o tamanho do buffer for igual ou menor que o tamanho da matriz, inserir maior ou igual ao tamanho do buffer levará à perda de dados, pois os dados em excesso serão truncados e os dados até o tamanho do buffer - 1 serão lidos.
  • Se o tamanho do buffer for maior que o tamanho de um array, então
    • inserir um tamanho menor que o tamanho do buffer funcionará, mas causará um erro
    • inserir um tamanho maior que o tamanho do buffer levará ao estouro do buffer e causará o mesmo erro.

3. Função fscanf_s() em C

A diferença entre fscanf() e fscanf_s() é a mesma de scanf() e scanf_s(). fscanf_s() é uma função segura que requer que o tamanho de cada campo do tipo c C s S e [ ] seja passado como um argumento imediatamente após a variável.

Sintaxe

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

Parâmetros

    str : string usada para recuperar dados formatar : string que contém o(s) especificador(es) de tipo … (reticências) : Indica que a função aceita um número variável de argumentos.

Observação : fscanf_s possui um parâmetro extra para especificar o tamanho do buffer e realmente controlar o limite da entrada.

Valor de retorno

  • Em caso de sucesso, a função retorna o número de valores lidos com sucesso.
  • No caso de uma falha de entrada antes que qualquer dado possa ser lido com êxito, o EOF é retornado.

Observação : fscanf_s funcionará apenas no MS Visual Studio.

Exemplo: Programa C para ilustrar a função 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  );   }   


Saída

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

4. Função sscanf_s() em C

sscanf_s() é uma função segura de sscanf() e funções seguras exigem que o tamanho de cada campo c C s S e [ type seja passado como um argumento imediatamente após a variável.

Sintaxe

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

Parâmetros

    str : string usada para recuperar dados formatar : string que contém o(s) especificador(es) de tipo … (reticências) : Indica que a função aceita um número variável de argumentos.

Observação : sscanf_s possui um parâmetro extra para especificar o tamanho do buffer e realmente controlar o limite da entrada.

Valor de retorno

  • Em caso de sucesso, a função retorna o número de valores lidos com sucesso.
  • No caso de uma falha de entrada antes que qualquer dado possa ser lido com êxito, o EOF é retornado.

Observação : sscanf_s() funcionará apenas no Microsoft Visual Studio.

Exemplo: Programa C para ilustrar a função 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  ;   }   


Saída

3 blue balls 

Criar questionário