Рубрики

Встроенные функции библиотеки для пользовательского ввода | scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s

  • scanf (): функция библиотеки C int scanf (const char * format,…) читает форматированный ввод из 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

    Каждый аргумент должен быть адресом памяти, в который записывается преобразованный результат. В случае успеха функция возвращает количество заполненных переменных. В случае сбоя ввода, прежде чем какие-либо данные могут быть успешно прочитаны, возвращается EOF.
    Спецификаторы типов, которые можно использовать в scanf:

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

    // Программа C иллюстрирует оператор scanf
    #include <stdio.h>
    #include <stdlib.h>

      

    int main()

    {

        char a[10]; 

        printf("Please enter your name : \n"); 

          

        // оператор scanf

        scanf("%s", a);

      

        printf("You entered: \n%s", a);

      

       return 0;

    }

    Input : Geek
    Output : Please enter your name : 
    You entered: 
    Geek
    
  • sscanf (): sscanf () используется для чтения отформатированного ввода из строки.
    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.

    В случае успеха функция возвращает количество заполненных переменных. В случае сбоя ввода до того, как какие-либо данные могут быть успешно прочитаны, возвращается EOF.

    // C программа для иллюстрации оператора sscanf
    #include <stdio.h>

      

    int main ()

    {

        // объявляем массив s

        char s [] = "3 red balls 2 blue balls"

        char str [10],str2 [10];

        int i;

          

        //% * s используется для пропуска слова

        sscanf (s,"%d %*s %*s %*s %s %s", &i, str, str2);

          

        printf ("%d %s %s \n", i, str, str2);

          

        return 0;

    }

  • fscanf () : fscanf () читает отформатированные данные из файла и сохраняет их в переменных.
    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)

    В случае успеха функция возвращает количество заполненных переменных. В случае сбоя ввода до того, как какие-либо данные могут быть успешно прочитаны, возвращается EOF.

    // C программа для иллюстрации оператора sscanf
    // Эта программа будет работать в системе, имеющей файл file.txt
    #include <stdio.h>
    #include <stdlib.h>

      

    int main()

    {

        char s1[10], s2[10], s3[10];

        int year;

          

        // указатель файла

        FILE * fp; 

          

        // открытие / создание файла

        fp = fopen ("file.txt", "w+");     

          

        // сохраняем строку в файле

        fputs("Hello World its 2017", fp); 

          

        // устанавливает позицию файла в начало файла

        rewind(fp); 

          

        // принимая входные данные из файла

        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 );

          

        // закрываем указатель файла

        fclose(fp);     

          

        return(0);

    }

     
    Output: String1 |Hello|
            String2 |World|
            String3 |its|
            Integer |2017|
  • scanf_s (): эта функция предназначена только для компиляторов Microsoft. Это то же самое, что и scanf, за исключением того, что оно не вызывает перегрузку буфера.
    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.

    В случае успеха функция возвращает количество заполненных переменных. В случае сбоя ввода, прежде чем какие-либо данные могут быть успешно прочитаны, возвращается EOF.
    Зачем использовать scanf_s ()?
    scanf просто читает любой ввод с консоли. C не проверяет, будет ли ввод пользователя соответствовать указанной вами переменной.
    Если у вас есть массив с именем color [3] и вы используете scanf для «Red», он будет работать нормально, но если пользователь введет более 3 символов, scanf начнет запись в память, которая не принадлежит цвету. C не поймает это и не предупредит вас, и может вызвать или не вызвать сбой программы, в зависимости от того, пытается ли что-то получить доступ и записать в этот слот памяти, который не принадлежит цвету. Это где scanf_s вступает в игру. scanf_s проверяет, что ввод пользователя будет помещаться в заданное пространство памяти.

    // C программа для иллюстрации оператора sscanf_s
    // scanf_s () будет работать только в Microsoft Visual Studio.
    #include <stdio.h>
    #include <stdlib.h>

      

    int main()

    {

        char a[5];

          

        // sizeof (a) - размер буфера

        scanf_s("%s", a, sizeof(a)); 

          

            printf("\n%s ", a);

      

        return 0;

    }

    Input : Red
    Output : Red
    
    Input : Yellow
    Output :               // no output
    
  • fscanf_s (): Разница между fscanf () и fscanf_s () такая же, как у scanf () и scanf_s (). fscanf_s () — это защищенная функция, а для защищенных функций требуется, чтобы размер каждого поля c, C, s, S и [type передавался как аргумент, следующий сразу за переменной.
    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.
    

    В случае успеха функция возвращает количество заполненных переменных. В случае сбоя ввода до того, как какие-либо данные могут быть успешно прочитаны, возвращается EOF.

    // C программа для иллюстрации оператора fscanf_s
    // Эта программа будет работать на MS Visual Studio
    #include <stdio.h>
    #include <stdlib.h>

      

    int main()

    {

        char s1[10], s2[10], s3[10];

        int year;

          

        // указатель файла

        FILE * fp; 

      

        // Безопасное открытие файла

        fopen_s(&fp,"file.txt", "w+"); 

          

        fputs("Hello World its 2017", fp); 

      

        rewind(fp);

      

        // Использование 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 () является защищенной функцией sscanf (), а защищенные функции требуют, чтобы размер каждого поля типа c, C, s, S и [передавался в качестве аргумента сразу после переменной.
    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.
    

    В случае успеха функция возвращает количество заполненных переменных. В случае сбоя ввода до того, как какие-либо данные могут быть успешно прочитаны, возвращается EOF.

    // C программа для иллюстрации оператора sscanf_s
    // Эта программа будет работать на MS Visual Studio
    #include <stdio.h>

      

    int main()

    {

        char s[] = "3 red balls 2 blue balls";

        char str[10], str2[10];

        int i;

      

        //% * s используется для пропуска слова

        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 
    

    Примечание: sscanf_s () будет работать только в Microsoft Visual Studio.

Эта статья предоставлена Kartik Ahuja . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Встроенные функции библиотеки для пользовательского ввода | scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s

0.00 (0%) 0 votes