שפת התכנות 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
צור חידון