Wbudowane funkcje biblioteczne do wprowadzania danych przez użytkownika | sscanf, scanf_s, fscanf_s, sscanf_s

Język programowania C zapewnia różne wbudowane funkcje biblioteczne do wprowadzania danych przez użytkownika. W tym artykule dowiemy się o funkcjach bibliotecznych sscanf scanf_s fscanf_s sscanf_s w C.

1. Funkcja sscanf() w C

sscanf() służy do odczytywania sformatowanych danych wejściowych z ciągu. Obie funkcje scanf() i sscanf() są podobne, jedyna różnica między nimi polega na tym, że funkcja scanf() odczytuje dane wejściowe od użytkownika ze standardowego wejścia, takiego jak klawiatura, a funkcja sscanf() odczytuje dane wejściowe z ciągu znaków i przechowuje je w innym ciągu.

Składnia

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

Parametry

    ul : Ciąg wejściowy, z którego chcemy odczytać dane. format : Ciąg znaków zawierający specyfikatory typu. … (wielokropek) : Wskazuje, że funkcja przyjmuje zmienną liczbę argumentów.

Wartość zwracana

  • W przypadku powodzenia funkcja zwraca liczbę pomyślnie odczytanych wartości.
  • W przypadku niepowodzenia wejściowego, zanim jakiekolwiek dane będą mogły zostać pomyślnie odczytane, zwracany jest współczynnik EOF.

Notatka : Powinno być co najmniej tyle argumentów, ile jest wartości przechowywanych przez specyfikatory formatu.

Przykład: program C ilustrujący funkcję 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  ;   }   

Wyjście
3 blue balls  

2. Funkcja scanf_s() w C

Ta funkcja jest specyficzna dla kompilatorów Microsoft. Działa tak samo jak scanf, z tą różnicą, że nie powoduje przeciążenia bufora. Funkcja scanf_s() jest bezpieczniejsza niż funkcja scanf(), ponieważ udostępnia dodatkowy parametr określający rozmiar bufora, który pozwala uniknąć przepełnienia bufora.

Składnia

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

Parametry

    strumień : Wskaźnik do obiektu File identyfikującego strumień. format : Jest to ciąg znaków zawierający specyfikatory typu. … (wielokropek) : Wskazuje, że funkcja przyjmuje zmienną liczbę argumentów.

Notatka : Tutaj możemy określić rozmiar bufora i faktycznie kontrolować limit danych wejściowych, aby cała aplikacja nie uległa awarii z powodu przepełnienia pamięci.

Wartość zwracana

  • W przypadku powodzenia funkcja zwraca liczbę odczytanych wartości.
  • W przypadku błędu wejściowego, zanim jakiekolwiek dane mogły zostać pomyślnie odczytane, zwracany jest współczynnik EOF.

Dlaczego warto używać scanf_s()?

scanf po prostu czyta dane wejściowe dostarczone z konsoli. C nie sprawdza, czy dane wprowadzone przez użytkownika zmieszczą się w wyznaczonej zmiennej. Jeśli masz tablicę o nazwie color[3] i użyjesz scanf dla ciągu Red, będzie działać dobrze, ale jeśli użytkownik wprowadzi więcej niż 3 znaki, scanf zacznie zapisywać w pamięci, która nie należy do tablicy kolorów.

C nie wyłapie tego ani nie ostrzeże, i może spowodować awarię programu lub nie, w zależności od tego, czy coś spróbuje uzyskać dostęp i zapisać w tym gnieździe pamięci, który nie należy do tablicy kolorów. Tutaj w grę wchodzi scanf_s. scanf_s sprawdza, czy dane wejściowe użytkownika zmieszczą się w danej przestrzeni pamięci.

Notatka : scanf_s() będzie działać tylko w Microsoft Visual Studio.

Przykład 1: Program C ilustrujący funkcję 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  ;   }   


Wejście 1

Red 

Wyjście 1

Red 

Wejście 2

Yellow 

Wyjście 2

No Output 

Przykład 2: Program w C ilustrujący relację pomiędzy rozmiarem bufora i rozmiarem tablicy.

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  ;   }   
  • Jeżeli rozmiar bufora jest równy lub mniejszy od rozmiaru tablicy, wówczas wprowadzenie rozmiaru bufora większego lub równego spowoduje utratę danych, gdyż nadmiar danych zostanie obcięty i odczytane zostaną dane do rozmiaru bufora - 1.
  • Jeśli rozmiar bufora jest większy niż rozmiar tablicy, to
    • wprowadzenie rozmiaru mniejszego niż rozmiar bufora zadziała, ale spowoduje błąd
    • wprowadzenie wartości większej niż rozmiar bufora doprowadzi do przepełnienia bufora i spowoduje ten sam błąd.

3. Funkcja fscanf_s() w C

Różnica pomiędzy fscanf() i fscanf_s() jest taka sama jak w przypadku scanf() i scanf_s(). fscanf_s() to bezpieczna funkcja, która wymaga przekazania rozmiaru każdego pola typu c C s S i [ ] jako argumentu bezpośrednio po zmiennej.

Składnia

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

Parametry

    ul : ciąg używany do pobierania danych format : ciąg zawierający specyfikatory typu … (wielokropek) : Wskazuje, że funkcja przyjmuje zmienną liczbę argumentów.

Notatka : fscanf_s ma dodatkowy parametr określający rozmiar bufora i faktycznie kontrolujący limit danych wejściowych.

Wartość zwracana

  • W przypadku powodzenia funkcja zwraca liczbę pomyślnie odczytanych wartości.
  • W przypadku błędu wejściowego, zanim jakiekolwiek dane mogły zostać pomyślnie odczytane, zwracany jest współczynnik EOF.

Notatka : fscanf_s będzie działać tylko w studiu MS Visual.

Przykład: program C ilustrujący funkcję 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  );   }   


Wyjście

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

4. Funkcja sscanf_s() w C

sscanf_s() to bezpieczna funkcja sscanf(), a bezpieczne funkcje wymagają przekazania rozmiaru każdego pola c C s S i [ type jako argumentu bezpośrednio po zmiennej.

Składnia

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

Parametry

    ul : ciąg używany do pobierania danych format : ciąg zawierający specyfikatory typu … (wielokropek) : Wskazuje, że funkcja przyjmuje zmienną liczbę argumentów.

Notatka : sscanf_s ma dodatkowy parametr określający rozmiar bufora i faktycznie kontrolujący limit danych wejściowych.

Wartość zwracana

  • W przypadku powodzenia funkcja zwraca liczbę pomyślnie odczytanych wartości.
  • W przypadku błędu wejściowego, zanim jakiekolwiek dane mogły zostać pomyślnie odczytane, zwracany jest współczynnik EOF.

Notatka : sscanf_s() będzie działać tylko w Microsoft Visual Studio.

Przykład: program C ilustrujący funkcję 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  ;   }   


Wyjście

3 blue balls 

Utwórz quiz