פונקציות ספרייה מובנות עבור קלט משתמש | 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   ...); 

פרמטרים

    str : מחרוזת קלט ממנה אנו רוצים לקרוא נתונים. פוּרמָט : מחרוזת המכילה את מפרט הסוג(ים). … (אליפסיס) : זה מציין שהפונקציה מקבלת מספר משתנה של ארגומנטים.

ערך החזרה

  • עם הצלחה הפונקציה מחזירה את מספר הערכים שנקראו בהצלחה.
  • במקרה של כשל בקלט לפני שניתן יהיה לקרוא בהצלחה נתונים כל 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]...); 

פרמטרים

    זֶרֶם : מצביע על אובייקט הקובץ שמזהה את הזרם. פוּרמָט : זוהי מחרוזת המכילה את מפרט הסוג(ים). … (אליפסיס) : זה מציין שהפונקציה מקבלת מספר משתנה של ארגומנטים.

פֶּתֶק : כאן נוכל לציין את גודל המאגר ולמעשה לשלוט על מגבלת הקלט כך שהאפליקציה כולה לא תקרוס עקב הצפת זיכרון.

ערך החזרה

  • עם הצלחה הפונקציה מחזירה את מספר הערכים שנקראו.
  • במקרה של כשל בקלט לפני שניתן היה לקרוא בהצלחה נתונים כלשהם, 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 ]... ); 

פרמטרים

    str : מחרוזת המשמשת לאחזור נתונים פוּרמָט : מחרוזת המכילה את מפרט הסוג(ים) : זה מציין שהפונקציה מקבלת מספר משתנה של ארגומנטים.

פֶּתֶק : 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 ו- [ סוג כארגומנט מיד אחרי המשתנה.

תַחבִּיר

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

פרמטרים

    str : מחרוזת המשמשת לאחזור נתונים פוּרמָט … (אליפסיס) : זה מציין שהפונקציה מקבלת מספר משתנה של ארגומנטים.

פֶּתֶק : 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 

צור חידון