logo

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.

jádro poruchy segmentace vyhozeno

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í datformá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í datformá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