Funciones de biblioteca incorporadas para entrada de usuario | scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s

  1. scanf() : La función de la biblioteca C int scanf (const char *format, …) lee la entrada formateada desde stdin.
    Syntax:
    int scanf(const char *format, ...)
    
    Return type: Integer
    
    Parameters:
    format: string that contains the type specifier(s) 
    "..." (ellipsis): indicates that the function accepts
    a variable number of arguments

    Cada argumento debe ser una dirección de memoria donde se escribe el resultado convertido. En caso de éxito, la función devuelve el número de variables rellenadas. En caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.
    Escriba los especificadores que se pueden usar en scanf:

    %c — Character
    %d — Signed integer
    %f — Floating point
    %s — String

    //C program t illustrate scanf statement
    #include <stdio.h>
    #include <stdlib.h>
      
    int main()
    {
        char a[10]; 
        printf("Please enter your name : \n"); 
          
        //scanf statement
        scanf("%s", a);
      
        printf("You entered: \n%s", a);
      
       return 0;
    }

    Aporte:

    Geek

    Producción:

    Please enter your name : 
    You entered: 
    Geek
  2. sscanf(): sscanf() se usa para leer la entrada formateada de la string.
    Syntax:
    int sscanf ( const char * s, const char * format, ...);
    
    Return type: Integer
    
    Parameters:
    s: string used to retrieve data
    format: string that contains the type specifier(s)
    … : arguments contains pointers to allocate 
    storage with appropriate type. 
    
    There should be at least as many of these arguments as the 
    number of values stored by the format specifiers.

    En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.

    // C program to illustrate sscanf statement
    #include <stdio.h>
      
    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;
    }

    Producción:

    3 blue balls
  3. fscanf() : fscanf() lee datos formateados del archivo y los almacena en variables.
    Syntax:
    int fscanf(FILE *stream, const char *format, ...)
    
    Parameters:
    Stream:  pointer to the File object that identifies the stream.
    format : is a string that contains the type specifier(s)
    

    En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.

    // C program to illustrate sscanf statement
    // This program will run on system having the file file.txt
    #include <stdio.h>
    #include <stdlib.h>
      
    int main()
    {
        char s1[10], s2[10], s3[10];
        int year;
          
        // file pointer
        FILE * fp; 
          
        // opening/creation of file
        fp = fopen ("file.txt", "w+");     
          
        // storing string in the file
        fputs("Hello World its 2017", fp); 
          
        // sets the file position to the beginning of the file
        rewind(fp); 
          
        // taking input from file
        fscanf(fp, "%s %s %s %d", s1, s2, s3, &year); 
          
        printf("String1 |%s|\n", s1 );
        printf("String2 |%s|\n", s2 );
        printf("String3 |%s|\n", s3 );
        printf("Integer |%d|\n", year );
          
        // close file pointer
        fclose(fp);     
          
        return(0);
    }

    Producción:

    String1 |Hello|
    String2 |World|
    String3 |its|
    Integer |2017|
    
  4. scanf_s() : esta función es específica de los compiladores de Microsoft. Es lo mismo que scanf, excepto que no provoca la sobrecarga del búfer.
    Syntax:
    int scanf_s(const char *format [argument]...);
    
    argument(parameter): here you can specify the buffer size and actually control the limit
    of the input so you don't crash the whole application.

    En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.
    ¿Por qué usar scanf_s()?
    scanf solo lee cualquier entrada que se proporcione desde la consola. C no verifica si la entrada del usuario encajará en la variable que ha designado.
    Si tiene una array llamada color[3] y usa scanf para «Rojo», funcionará bien, pero si el usuario ingresa más de 3 caracteres, scanf comienza a escribir en la memoria que no pertenece al color. C no detectará esto ni le advertirá y podría o no bloquear el programa, dependiendo de si algo intenta acceder y escribir en esa ranura de memoria que no pertenece al color. Aquí es donde entra en juego scanf_s. scanf_s verifica que la entrada del usuario quepa en el espacio de memoria dado.

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

    Aporte:

    Red

    Producción:

    Red

    Aporte:

    Yellow

    Producción:

    No Output

    Ilustrando la relación entre el tamaño del búfer y el tamaño de la array.

    C

    // C program
    // consumes the Enter key 
    // (newline character) pressed after input
    #include<stdio.h>
      
    char ch[100000];
    printf("Enter characters: ");
    scanf_s("%s", ch, 99999);
    getchar();

    C++

    // C++ program
    // consumes the Enter key 
    // (newline character) pressed after input
      
    #include "stdafx.h"
      
    int _tmain(int argc, _TCHAR* argv[])
    {
        // example
        char ch[100000];
        printf("Enter characters: ");
        scanf_s("%s", ch, 99999);
        getchar();
        return 0;
    }
    1. Si el tamaño del búfer es igual o menor que el tamaño de la array, ingresar un tamaño mayor o igual que el tamaño del búfer no hará nada.
    2. Si el tamaño del búfer es mayor que el tamaño de una array, entonces
      1. ingresar un tamaño más pequeño que el tamaño del búfer funcionará pero dará un error

        «Error de verificación en tiempo de ejecución n.º 2: la pila alrededor de la variable ‘nombre_variable’ estaba dañada».

      2. ingresar más grande que el tamaño del búfer no hará nada y dará el mismo error.
  5. fscanf_s() : La diferencia entre fscanf() y fscanf_s() es la misma que entre scanf() y scanf_s(). fscanf_s() es una función segura y las funciones seguras requieren que el tamaño de cada campo de tipo c, C, s, S y [ se pase como un argumento inmediatamente después de la variable.
    Syntax:
    int fscanf_s(   FILE *stream,  const char *format ,[argument ]... ); 
    
    fscanf_s has an extra argument(parameter) where you can 
    specify the buffer size and actually control the limit of the input.
    

    En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.

    //C program to illustrate fscanf_s statement
    //This program will run on MS Visual studio
    #include <stdio.h>
    #include <stdlib.h>
      
    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);
    }

    Producción:

    String1 |Hello|
    String2 |World|
    String3 |its|
    Integer |2017|
    
  6. sscanf_s() : sscanf_s() es una función segura de sscanf() y las funciones seguras requieren que el tamaño de cada campo de tipo c, C, s, S y [ se pase como argumento inmediatamente después de la variable.
    Syntax:
    int sscanf_s(const char *restrict buffer, const char *restrict format, ...);
    
    sscanf_s has an extra argument(parameter) where you can specify 
    the buffer size and actually control the limit of the input.
    

    En caso de éxito, la función devuelve el número de variables rellenadas. En el caso de una falla de entrada, antes de que los datos puedan leerse con éxito, se devuelve EOF.

    //C program to illustrate sscanf_s statement
    //This program will run on MS Visual studio
    #include <stdio.h>
      
    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;
    }

    Producción:

    3 blue balls 
    

    Nota: sscanf_s() solo funcionará en Microsoft Visual Studio.

Este artículo es una contribución de Kartik Ahuja . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *