Vestavěné funkce knihovny pro uživatelský vstup | sscanf, scanf_s, fscanf_s, sscanf_s

Programovací jazyk C poskytuje různé funkce vestavěné knihovny pro uživatelský vstup. V tomto článku se dozvíme o funkcích knihovny sscanf scanf_s fscanf_s sscanf_s v jazyce C.

1. Funkce sscanf() v C

sscanf() se používá ke čtení formátovaného vstupu z řetězce. Funkce scanf() a sscanf() jsou podobné, jediný rozdíl mezi nimi je ten, že funkce scanf() čte vstup od uživatele ze standardního vstupu, jako je klávesnice, a funkce sscanf() čte vstup z řetězce a ukládá vstup do jiného řetězce.

Syntax

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

Parametry

    str : Vstupní řetězec, ze kterého chceme číst data. formát : Řetězec, který obsahuje specifikátor(y). … (elipsa) : Označuje, že funkce přijímá proměnný počet argumentů.

Návratová hodnota

  • V případě úspěchu funkce vrátí počet úspěšně přečtených hodnot.
  • V případě selhání vstupu dříve, než je možné úspěšně přečíst jakákoli data, se vrátí EOF.

Poznámka : Těchto argumentů by mělo být alespoň tolik, kolik je hodnot uložených ve specifikátorech formátu.

Příklad: C Program pro ilustraci funkce 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  ;   }   

Výstup
3 blue balls  

2. Funkce scanf_s() v C

Tato funkce je specifická pro kompilátory společnosti Microsoft. Je to stejné jako scanf kromě toho, že nezpůsobuje přetížení vyrovnávací paměti. Funkce scanf_s() je bezpečnější než funkce scanf(), protože poskytuje další parametr pro specifikaci velikosti vyrovnávací paměti, která může zabránit přetečení vyrovnávací paměti.

Syntax

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

Parametry

    proud : Ukazatel na objekt File, který identifikuje stream. formát : Je to řetězec, který obsahuje specifikátor(y). … (elipsa) : Označuje, že funkce přijímá proměnný počet argumentů.

Poznámka : Zde můžeme specifikovat velikost bufferu a vlastně řídit limit vstupu, aby celá aplikace nespadla kvůli přetečení paměti.

Návratová hodnota

  • V případě úspěchu funkce vrátí počet přečtených hodnot.
  • V případě selhání vstupu dříve, než bylo možné úspěšně přečíst jakákoli data, se vrátí EOF.

Proč používat scanf_s()?

scanf pouze čte jakýkoli vstup poskytnutý z konzoly. C nekontroluje, zda se uživatelský vstup vejde do proměnné, kterou jste určili. Pokud máte pole s názvem color[3] a použijete scanf pro řetězec Red, bude to fungovat dobře, ale pokud uživatel zadá více než 3 znaky, scanf začne zapisovat do paměti, která nepatří do pole barev.

C to nezachytí ani vás neupozorní a může nebo nemusí spadnout program v závislosti na tom, zda se něco pokusí o přístup a zápis do tohoto paměťového slotu, který nepatří do barevného pole. Zde vstupuje do hry scanf_s. scanf_s kontroluje, zda se uživatelský vstup vejde do daného paměťového prostoru.

Poznámka : scanf_s() bude fungovat pouze v Microsoft Visual Studio.

Příklad 1: C Program pro ilustraci funkce 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  ;   }   


Vstup 1

Red 

Výstup 1

Red 

Vstup 2

Yellow 

Výstup 2

No Output 

Příklad 2: C Program pro ilustraci vztahu mezi velikostí vyrovnávací paměti a velikostí pole.

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  ;   }   
  • Pokud je velikost vyrovnávací paměti rovna nebo menší než velikost pole, pak zadání větší nebo rovné velikosti vyrovnávací paměti povede ke ztrátě dat, protože nadbytečná data budou zkrácena a budou načtena data do velikosti vyrovnávací paměti - 1.
  • Pokud je velikost vyrovnávací paměti větší než velikost pole, pak
    • zadání menší než velikost vyrovnávací paměti bude fungovat, ale zobrazí chybu
    • zadání větší než velikost vyrovnávací paměti povede k přetečení vyrovnávací paměti a vyvolá stejnou chybu.

3. Funkce fscanf_s() v C

Rozdíl mezi fscanf() a fscanf_s() je stejný jako u scanf() a scanf_s(). fscanf_s() je bezpečná funkce, která vyžaduje, aby velikost každého pole typu c Cs S a [ ] byla předána jako argument bezprostředně za proměnnou.

Syntax

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

Parametry

    str : řetězec používaný k načtení dat formát : řetězec, který obsahuje specifikátor(y) typu … (elipsa) : Označuje, že funkce přijímá proměnný počet argumentů.

Poznámka : fscanf_s má další parametr, který specifikuje velikost vyrovnávací paměti a skutečně řídí limit vstupu.

Návratová hodnota

  • V případě úspěchu funkce vrátí počet úspěšně přečtených hodnot.
  • V případě selhání vstupu dříve, než bylo možné úspěšně přečíst jakákoli data, se vrátí EOF.

Poznámka : fscanf_s bude fungovat pouze v MS Visual Studio.

Příklad: C Program pro ilustraci funkce 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  );   }   


Výstup

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

4. Funkce sscanf_s() v C

sscanf_s() je bezpečná funkce sscanf() a zabezpečené funkce vyžadují, aby velikost každého pole typu c C s S a [ byla předána jako argument bezprostředně za proměnnou.

Syntax

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

Parametry

    str : řetězec používaný k načtení dat formát : řetězec, který obsahuje specifikátor(y) typu … (elipsa) : Označuje, že funkce přijímá proměnný počet argumentů.

Poznámka : sscanf_s má další parametr, který specifikuje velikost vyrovnávací paměti a skutečně řídí limit vstupu.

Návratová hodnota

  • V případě úspěchu funkce vrátí počet úspěšně přečtených hodnot.
  • V případě selhání vstupu dříve, než bylo možné úspěšně přečíst jakákoli data, se vrátí EOF.

Poznámka : sscanf_s() bude fungovat pouze v Microsoft Visual Studio.

Příklad: C Program pro ilustraci funkce 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  ;   }   


Výstup

3 blue balls 

Vytvořit kvíz