logo

Вградени библиотечни функции за потребителско въвеждане | sscanf, scanf_s, fscanf_s, sscanf_s

Езикът за програмиране C предоставя различни вградени библиотечни функции за въвеждане от потребителя. В тази статия ще научим за библиотечните функции на sscanf scanf_s fscanf_s sscanf_s в C.

1. Функция sscanf() в C

sscanf() се използва за четене на форматиран вход от низа. Функциите scanf() и sscanf() са сходни, единствената разлика между тях е, че функцията scanf() чете вход от потребителя от стандартен вход като клавиатура, а функцията sscanf() чете вход от низ и съхранява входа в друг низ.

Синтаксис

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

Параметри

    ул: Входен низ, от който искаме да прочетем данни.формат: Низ, който съдържа спецификатора(ите) на типа.… (многоточие): Показва, че функцията приема променлив брой аргументи.

Върната стойност

  • При успех функцията връща броя на успешно прочетените стойности.
  • В случай на неуспешно въвеждане, преди данните да могат да бъдат успешно прочетени, се връща EOF.

Забележка : Трябва да има поне толкова от тези аргументи, колкото е броят на стойностите, съхранени от спецификаторите на формата.



Пример: C програма за илюстриране на 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; } 

Изход
3 blue balls 

2. scanf_s() Функция в C

Тази функция е специфична за компилаторите на Microsoft. Това е същото като scanf, но не причинява претоварване на буфера. Функцията scanf_s() е по-сигурна от функцията scanf(), тъй като предоставя допълнителен параметър за указване на размера на буфера, който може да избегне препълването на буфера.

Синтаксис

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

Параметри

    поток: Показател към обекта File, който идентифицира потока.формат: Това е низ, който съдържа спецификатора(ите) на типа.… (многоточие): Показва, че функцията приема променлив брой аргументи.

Забележка : Тук можем да посочим размера на буфера и всъщност да контролираме лимита на входа, така че цялото приложение да не се срине поради препълване на паметта.

Върната стойност

  • При успех функцията връща броя прочетени стойности.
  • В случай на неуспешно въвеждане, преди данните да могат да бъдат успешно прочетени, се връща EOF.

Защо да използвам scanf_s()?

scanf просто чете каквото и да е въвеждане от конзолата. C не проверява дали въведеното от потребителя ще се побере в променливата, която сте посочили. Ако имате масив, наречен color[3], и използвате scanf за низа Red, той ще работи добре, но ако потребителят въведе повече от 3 символа, scanf започва да записва в паметта, която не принадлежи на цветния масив.

C няма да улови това или да ви предупреди и може или не може да срине програмата в зависимост от това дали нещо се опитва да осъществи достъп и да запише в този слот за памет, който не принадлежи към цветовия масив. Тук влиза в действие scanf_s. scanf_s проверява дали въведеното от потребителя ще се побере в даденото пространство на паметта.

Забележка : scanf_s() ще работи само в Microsoft Visual Studio.

Пример 1: C програма за илюстриране на функция 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; } 


Вход 1

Red

Изход 1

Red

Вход 2

Yellow

Резултат 2

No Output

Пример 2: C програма за илюстриране на връзката между размера на буфера и размера на масива.

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; } 
  • Ако размерът на буфера е равен или по-малък от размера на масива, тогава въвеждането на по-голям или равен на размера на буфера ще доведе до загуба на данни, тъй като излишните данни ще бъдат съкратени и данните до размер на буфера - 1 ще бъдат прочетени.
  • Ако размерът на буфера е по-голям от размера на масива, тогава
    • въвеждането на по-малък от размера на буфера ще работи, но ще даде грешка
    • въвеждането на по-голям от размера на буфера ще доведе до препълване на буфера и ще даде същата грешка.

3. Функция fscanf_s() в C

Разликата между fscanf() и fscanf_s() е същата като тази на scanf() и scanf_s(). fscanf_s() е защитена функция, която изисква размерът на всяко поле за тип c C s S и [] да се предава като аргумент непосредствено след променливата.

Синтаксис

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

Параметри

    ул: низ, използван за извличане на данниформат: низ, който съдържа спецификатора(ите) на типа… (многоточие): Показва, че функцията приема променлив брой аргументи.

Забележка : fscanf_s има допълнителен параметър за определяне на размера на буфера и действително контролира лимита на входа.

Върната стойност

  • При успех функцията връща броя на успешно прочетените стойности.
  • В случай на неуспешно въвеждане, преди данните да могат да бъдат успешно прочетени, се връща EOF.

Забележка : fscanf_s ще работи само в MS Visual studio.

Пример: C програма за илюстриране на функция 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); } 


Изход

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

4. Функция sscanf_s() в C

sscanf_s() е защитена функция на sscanf() и защитените функции изискват размерът на всяко поле c C s S и [ type да се предава като аргумент непосредствено след променливата.

Синтаксис

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

Параметри

    ул: низ, използван за извличане на данниформат: низ, който съдържа спецификатора(ите) на типа… (многоточие): Показва, че функцията приема променлив брой аргументи.

Забележка : sscanf_s има допълнителен параметър за определяне на размера на буфера и действително контролира лимита на входа.

Върната стойност

  • При успех функцията връща броя на успешно прочетените стойности.
  • В случай на неуспешно въвеждане, преди данните да могат да бъдат успешно прочетени, се връща EOF.

Забележка : sscanf_s() ще работи само в Microsoft Visual Studio.

Пример: C програма за илюстриране на функция 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; } 


Изход

3 blue balls

Създаване на тест