פונקציות ספרייה מובנות עבור קלט משתמש | 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 מוחזר.
- עם הצלחה הפונקציה מחזירה את מספר הערכים שנקראו.
- במקרה של כשל בקלט לפני שניתן היה לקרוא בהצלחה נתונים כלשהם, EOF מוחזר.
- אם גודל המאגר שווה או קטן מגודל המערך אז הזנה גדולה או שווה לגודל המאגר תוביל לאובדן נתונים מכיוון שהנתונים העודפים יקוצצו והנתונים עד לגודל המאגר - 1 ייקראו.
- אם גודל המאגר גדול מגודלו של מערך אז
- הזנה קטנה מגודל המאגר תסתדר אך תיתן שגיאה
- הזנה גדולה מגודל המאגר תוביל להצפת מאגר ותיתן את אותה שגיאה.
- עם הצלחה הפונקציה מחזירה את מספר הערכים שנקראו בהצלחה.
- במקרה של כשל בקלט לפני שניתן היה לקרוא בהצלחה נתונים כלשהם, EOF מוחזר.
- עם הצלחה הפונקציה מחזירה את מספר הערכים שנקראו בהצלחה.
- במקרה של כשל בקלט לפני שניתן היה לקרוא בהצלחה נתונים כלשהם, 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]...);
פרמטרים
פֶּתֶק : כאן נוכל לציין את גודל המאגר ולמעשה לשלוט על מגבלת הקלט כך שהאפליקציה כולה לא תקרוס עקב הצפת זיכרון.
ערך החזרה
למה להשתמש ב-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 ; }
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 יש פרמטר נוסף כדי לציין את גודל המאגר ולמעשה לשלוט על הגבול של הקלט.
ערך החזרה
פֶּתֶק : 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 ...);
פרמטרים
פֶּתֶק : sscanf_s יש פרמטר נוסף כדי לציין את גודל המאגר ולמעשה לשלוט על הגבול של הקלט.
ערך החזרה
פֶּתֶק : 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
צור חידון