Inbuilt library functions for user Input | scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s

  • scanf() : The C library function int scanf (const char *format, …) reads formatted input from stdin.
    Syntax:
    int scanf(const char *format, ...)
    int: return type
    format: string that contains the type specifier(s) 
    "..." (ellipsis): indicates that the function accepts a variable number of arguments

    Each argument must be a memory address where the converted result is written to. On success, the function returns the number of variables filled. In case of an input failure, before any data could be successfully read, EOF is returned.
    Type specifiers that can be used in 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;
    }
    
    Input : Geek
    Output : Please enter your name : 
    You entered: 
    Geek
    
  • sscanf() : sscanf() is used to read formatted input from the string.
    Syntax:
    int sscanf ( const char * s, const char * format, ...);
    int: return type
    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.

    On success, the function returns the number of variables filled. In the case of an input failure before any data could be successfully read, EOF is returned.

    //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;
    }
    
    
  • fscanf(): fscanf() reads formatted data from file and stores it into variables.
    Syntax:
    int fscanf(FILE *stream, const char *format, ...)
    Stream:  pointer to the File object that identifies the stream.
    format : is a string that contains the type specifier(s)

    On success, the function returns the number of variables filled. In the case of an input failure before any data could be successfully read, EOF is returned.

    //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);
    }
    
     
    Output: String1 |Hello|
            String2 |World|
            String3 |its|
            Integer |2017|
  • scanf_s() : This function is specific to Microsoft compilers. It is the same as scanf, except it does not cause buffer overload.
    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.

    On success, the function returns the number of variables filled. In the case of an input failure, before any data could be successfully read, EOF is returned.
    Why to use scanf_s()?
    scanf just reads whatever input is provided from the console. C does not check whether the user input will fit in the variable that you’ve designated.
    If you have an array called color[3] and you use scanf for “Red”, it will work fine but if user enter more than 3 characters scanf starts writing into memory that doesn’t belong to color. C won’t catch this or warn you and it might or might not crash the program, depending if something tries to access and write on that memory slot that doesn’t belong to color. This is where scanf_s comes into play. scanf_s checks that the user input will fit in the given memory space.

    //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;
    }
    
    
    Input : Red
    Output : Red
    
    Input : Yellow
    Output :               // no output
    
  • fscanf_s() : Difference between fscanf() and fscanf_s() is same as that of scanf() and scanf_s(). fscanf_s() is secure function and secure functions require the size of each c, C, s, S and [ type field to be passed as an argument immediately following the 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.
    

    On success, the function returns the number of variables filled. In the case of an input failure before any data could be successfully read, EOF is returned.

    //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);
    }
    
    
     
    Output: String1 |Hello|
            String2 |World|
            String3 |its|
            Integer |2017|
  • sscanf_s() : sscanf_s() is secure function of sscanf() and secure functions require the size of each c, C, s, S and [ type field to be passed as an argument immediately following the 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.
    

    On success, the function returns the number of variables filled. In the case of an input failure before any data could be successfully read, EOF is returned.

    //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;
    }
    
    
     
    Output: 3 blue balls 
    

    Note:sscanf_s() will only work in Microsoft Visual Studio.

This article is contributed by Kartik Ahuja. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice





Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.