Scanf C תיאור הפונקציה
Scanf C תיאור הפונקציה

וִידֵאוֹ: Scanf C תיאור הפונקציה

וִידֵאוֹ: Scanf C תיאור הפונקציה
וִידֵאוֹ: MOST VALUABLE RARE JAPAN coins of value - numismatics 2024, מאי
Anonim

במאמר זה, הפונקציה scanf() נחשבת בצורה כללית ללא התייחסות לתקן ספציפי, ולכן נתונים מכל תקני C99, C11, C++11, C++14 כלולים כאן. אולי, בתקנים מסוימים, הפונקציה פועלת עם הבדלים מהחומר המוצג במאמר.

scanf C function - description

scanf() היא פונקציה הממוקמת בקבצי הכותרת stdio.h(C) ו-cstdio(C++), הידועה גם בשם קלט תוכנית מעוצב. scanf קורא תווים מזרם הקלט הסטנדרטי (stdin) וממיר אותם בהתאם לפורמט, ואז כותב אותם למשתנים שצוינו. פורמט - פירושו שהנתונים מומרים לטופס מסוים עם קבלתם. לפיכך, פונקציית scanf C מתוארת:

scanf("%format", &variable1[, &variable2, […]), כאשר משתנים מועברים ככתובות. הסיבה לדרך זו של העברת משתנים לפונקציה ברורה: כתוצאה מעבודה, היא מחזירה ערך המציין נוכחות של שגיאות, כךהדרך היחידה לשנות את ערכי המשתנים היא על ידי העברת כתובת. כמו כן, הודות לשיטה זו, הפונקציה יכולה לעבד נתונים מכל סוג.

מתכנתים מסוימים מתייחסים לפונקציות כמו scanf() או printf() כאל פרוצדורות בגלל האנלוגיה לשפות אחרות.

Scanf מאפשר קלט של כל סוגי השפות הבסיסיות: char, int, float, string וכו'. במקרה של משתנים מסוג מחרוזת, אין צורך לציין את סימן הכתובת - "&", שכן המשתנה של מחרוזת סוג הוא מערך, ושמו הוא כתובת האלמנט הראשון של המערך בזיכרון המחשב..

שימוש ב-C ב-C++
שימוש ב-C ב-C++

פורמט הזנת נתונים או מחרוזת בקרה

התחל בהסתכלות בדוגמה של פונקציית scanf C מהתיאור.


include int main() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); החזר 0; //דרישה למערכות לינוקס }

פורמט הקלט מורכב מארבעת הפרמטרים הבאים: %[width][modifiers] type. במקרה זה, הסימן "%" והסוג הם פרמטרים חובה. כלומר, הפורמט המינימלי נראה כך: "%s", "%d" וכן הלאה.

באופן כללי, התווים המרכיבים את מחרוזת הפורמט מחולקים ל:

  • מפרט פורמט - כל דבר שמתחיל ב-%;
  • תווים מפרידים או רווחים - הם רווח, טאב(t), שורה חדשה (n);
  • תווים מלבד רווח לבן.

ייתכן שהפונקציה לא בטוחה.

השתמש ב-scanf_s() במקום ב-scanf().

(הודעה מ-Visual Studio)

מפרט, או פורמט, או תווי המרה, או תווי בקרה

קוד בינארי
קוד בינארי

הצהרת scanf C חייבת להכיל לפחות מפרט פורמט, שצוין בסוף ביטויים המתחילים ב-"%". זה אומר לתוכנית את סוג הנתונים לצפות בעת הכניסה, בדרך כלל מהמקלדת. רשימה של כל מפרטי הפורמט בטבלה למטה.

סוג משמעות
1 %c התוכנית ממתינה לקלט תו. המשתנה שייכתב חייב להיות מסוג התו char.
2 %d התוכנית מצפה לקלט של מספר עשרוני מסוג מספר שלם. המשתנה חייב להיות מסוג int.
3 %i התוכנית מצפה לקלט של מספר עשרוני מסוג מספר שלם. המשתנה חייב להיות מסוג int.
4 %e, %E התוכנית מצפה להזין מספר נקודה צפה (פסיק) בצורה אקספוננציאלית. המשתנה חייב להיות מסוג float.
5 %f התוכנית מצפה למספר נקודה צפה (פסיק). המשתנה חייב להיות מסוג float.
6 %g, %G התוכנית מצפה למספר נקודה צפה (פסיק).המשתנה חייב להיות מסוג float.
7 %a התוכנית מצפה למספר נקודה צפה (פסיק). המשתנה חייב להיות מסוג float.
8 %o התוכנית מצפה למספר אוקטלי. המשתנה חייב להיות מסוג int.
9 %s התוכנית ממתינה להזנת מחרוזת. מחרוזת היא קבוצה של תווים כלשהם עד לתו המפריד הראשון שנתקל בהם. המשתנה חייב להיות מסוג string.
10 %x, %X התוכנית ממתינה למספר הקסדצימלי. המשתנה חייב להיות מסוג int.
11 %p המשתנה מצפה לקלט מצביע. המשתנה חייב להיות מסוג מצביע.
12 %n כותב למשתנה ערך שלם השווה למספר התווים שנקראו עד כה על ידי פונקציית scanf.
13 %u התוכנית קוראת מספר שלם ללא סימן. סוג המשתנה חייב להיות מספר שלם ללא סימן.
14 %b התוכנית ממתינה למספר בינארי. המשתנה חייב להיות מסוג int.

15

% סט תווים סרוק. התוכנית ממתינה להזנת תווים.מהבריכה המוגבלת שצוינה בין סוגריים מרובעים. scanf יעבוד כל עוד יש תווים מהקבוצה שצוינה בזרם הקלט.
16 %% חתום "%".

תווים במחרוזת הפורמט

קוד C++
קוד C++

סמל כוכב ()

הכוכבית () היא דגל המציין שיש לדכא את פעולת ההקצאה. כוכבית ממוקמת מיד אחרי הסימן "%". לדוגמה,


scanf("%d%c%d", &x, &y); //התעלם מאופי בין שני מספרים שלמים. scanf("%s%d%s", str, str2); //התעלם ממספר שלם בין שתי מחרוזות.

כלומר, אם תזין את השורה "45-20" בקונסולה, התוכנית תעשה את הפעולות הבאות:

  1. למשתנה "x" יוקצה הערך 45.
  2. למשתנה "y" יוקצה הערך 20.
  3. וסימן המינוס (מקף) "-" יתעלם הודות ל-"%c".

Width (או רוחב השדה)

זהו מספר שלם בין הסימן "%" למפרט הפורמט המציין את המספר המרבי של תווים לקריאה בפעולת הקריאה הנוכחית.


scanf("%20s", str); //קרא את 20 התווים הראשונים מזרם הקלט

יש כמה דברים חשובים שכדאי לזכור:

  1. scanf יסתיים אם הוא יתקל בתו מפריד, גם אם הוא לא ספר 20 תווים.
  2. אם יותר מ-20 תווים מוזנים, רק 20 התווים הראשונים ייכתבו ל-str.

משניםסוג (או דיוק)

קוד התזה
קוד התזה

אלה הם דגלים מיוחדים שמשנים את סוג הנתונים הצפוי לקלט. הדגל מצוין משמאל למפרט הסוג:

  • L או l (קטן L) כאשר משתמשים ב-"l" עם המפרטים d, i, o, u, x, הדגל אומר לתוכנית שצפוי קלט ארוך int. כאשר משתמשים ב-"l" עם מפרט e או f, הדגל אומר לתוכנית שעליה לצפות לערך כפול. השימוש ב-"L" אומר לתוכנית כי צפוי כפיל ארוך. השימוש ב-"l" עם המפרטים "c" ו-"s" אומר לתוכנית שצפויים לתווים של שני בייטים כמו wchar_t. לדוגמה, "%lc", "%ls", "%l[asd]".
  • h הוא דגל המציין את הסוג הקצר.
  • hh - מציין שהמשתנה הוא מצביע לערך char עם סימן או ללא סימן. ניתן להשתמש בדגל עם המפרטים d, i, o, u, x, n.
  • ll (שתי L's קטנות) - מציין שהמשתנה הוא מצביע לערך מסוג חתום long long int או unsigned long long int. הדגל משמש עם מפרטים: d, i, o, u, x, n.
  • j - מציין שהמשתנה הוא מצביע לסוג intmax_t או uintmax_t מקובץ הכותרת stdint.h. בשימוש עם מפרטים: d, i, o, u, x, n.
  • z - מציין שהמשתנה הוא מצביע לסוג size_t, שההגדרה שלו נמצאת ב-stddef.h. בשימוש עם מפרטים: d, i, o, u, x, n.
  • t - מציין שהמשתנה הוא מצביע לסוג ptrdiff_t. הגדרה עלסוג זה נמצא ב-stddef.h. בשימוש עם מפרטים: d, i, o, u, x, n.

בצורה ברורה יותר, ניתן לייצג את התמונה עם השינויים כטבלה. תיאור כזה של scanf C למתכנתים יהיה ברור יותר.

מפרטי סוג ומשנים
מפרטי סוג ומשנים

תווים אחרים

כל התווים שייתקלו בפורמט יימחקו. יחד עם זאת, יש לשים לב שנוכחותם של רווח לבן או תווי מפריד (שורה חדשה, רווח, טאב) במחרוזת הבקרה יכולה להוביל להתנהגות שונה של הפונקציה. בגרסה אחת, scanf() יקרא מבלי לשמור מספר מפריד עד שהוא יתקל בתו אחר מלבד המפריד, ובגרסה אחרת, הרווחים (רק הם) אינם משחקים תפקיד והביטוי "%d + %d" שווה ל-"% d+%d".

דוגמה לקוד C++
דוגמה לקוד C++

דוגמאות

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


scanf("%3s", str); //אם תזין את המחרוזת "1d2s3d1;3" במסוף, רק "1d2" ייכתב ל-str scanf("%dminus%d", &x, &y); תווים //מינוס בין שני מספרים יימחקו scanf("%5[0-9]", str); תווים // יוזנו ב-str עד שיהיו 5 תווים והתווים הם מספרים מ-0 עד 9. scanf("%lf", &d); //expect double input scanf("%hd", &x); //מספר צפוי מסוג short scanf("%hu", &y); //expect number unsigned short scanf("lx", &z); //מספר צפוי של סוג ארוך int

מאתהדוגמאות שלהלן מראות כיצד המספר הצפוי משתנה באמצעות סמלים שונים.

scanf C - תיאור למתחילים

קטע זה יהיה שימושי למתחילים. לעתים קרובות אתה צריך שיהיה לך בהישג יד, לא כל כך תיאור מלא של scanf C כמו הפרטים של אופן הפעולה של הפונקציה.

  • תכונה זו מעט מיושנת. ישנם מספר יישומים שונים בספריות של גרסאות שונות. לדוגמה, הפונקציה המשופרת scanf S C, שתיאור שלה ניתן למצוא באתר מיקרוסופט.
  • מספר המפרטים בפורמט חייב להתאים למספר הארגומנטים המועברים לפונקציה.
  • יש להפריד בין רכיבי זרם קלט רק באמצעות תווי מפריד: רווח, טאב, שורה חדשה. פסיק, נקודה-פסיק, נקודה וכו' - תווים אלו אינם מפרידים עבור הפונקציה scanf().
  • אם scanf נתקל בתו מפריד, הקלט יופסק. אם יש יותר ממשתנה אחד לקריאה, scanf יעבור לקריאת המשתנה הבא.
  • אי העקביות הקלה ביותר בפורמט נתוני הקלט מובילה לתוצאות בלתי צפויות של התוכנית. ובכן, אם התוכנית רק מסתיימת בשגיאה. אבל לעתים קרובות התוכנית ממשיכה לעבוד ועושה את זה לא נכון.
  • scanf("%20s …", …); אם זרם הקלט עולה על 20 תווים, אז scanf יקרא את 20 התווים הראשונים ויבטל או יעבור לקריאת המשתנה הבא, אם צוין כזה. במקרה זה, הקריאה הבאה ל- scanf תמשיך לקרוא את זרם הקלט מהנקודה שבה נעצרה העבודה של הקריאה הקודמת ל- scanf. אם כשקוראים את 20 הראשוניםתווים, נתקל בתו מפריד, scanf יבטל או ימשיך לקרוא את המשתנה הבא, גם אם הוא לא קרא 20 תווים עבור המשתנה הראשון. במקרה זה, כל התווים שלא נקראו יצורפו למשתנה הבא.
  • אם קבוצת התווים הסרוקים מתחילה ב-"^", אז scanf יקרא את הנתונים עד שהוא יתקל בתו מפריד או תו מהקבוצה. לדוגמה, "%[^A-E1-5]" יקרא נתונים מהזרם עד שייתקל באחד מהאותיות הגדולות באנגלית מ-A עד E או אחד מהמספרים מ-1 עד 5.
  • פונקציית scanf C, כמתואר, מחזירה מספר השווה למספר המוצלח של כתיבה למשתנים. אם scanf כותב 3 משתנים, אז תוצאת ההצלחה של הפונקציה תחזיר את המספר 3. אם scanf לא הצליח לכתוב משתנים כלשהם, אז התוצאה תהיה 0. ולבסוף, אם scanf לא יכול היה להתחיל בכלל מסיבה כלשהי, התוצאה תהיה EOF.
  • אם הפונקציה scanf() הסתיימה בצורה שגויה. לדוגמה, scanf("%d", &x) - היה צפוי מספר, אך תווים התקבלו כקלט. הקריאה הבאה ל-scanf() תתחיל בנקודה בזרם הקלט שבה הסתיימה קריאת הפונקציה הקודמת. כדי להתגבר על בעיה זו, יש צורך להיפטר מהדמויות הבעייתיות. ניתן לעשות זאת, למשל, על ידי קריאה ל-scanf("%s"). כלומר, הפונקציה תקרא מחרוזת תווים ותזרוק אותה. בדרך המסובכת הזו, אתה יכול להמשיך להזין את הנתונים הדרושים.
  • בחלק מהטמעות של scanf(), "-" אסור בערכת התווים הסרוקה.
  • מפרט "%c" קורא כל תו מהזרם. כלומר, הוא קורא גם את תו המפריד. כדי לדלג על תו המפריד ולהמשיך לקרוא את התו הרצוי, תוכל להשתמש ב-"%1s".
  • כאשר משתמשים במפרט "c", מותר להשתמש ברוחב "%10c", אבל אז יש להעביר מערך של אלמנטים מסוג char כמשתנה לפונקציית scanf.
  • "%[a-z]" פירושו "כל האותיות הקטנות של האלפבית האנגלי", ו-"%[z-a]" פירושו רק 3 תווים: 'z', 'a', '-'. במילים אחרות, התו "-" פירושו טווח רק אם הוא בין שני תווים בסדר הנכון. אם "-" נמצא בסוף ביטוי, בהתחלה, או בסדר שגוי של התווים משני הצדדים שלהם, אז זה רק תו מקף, לא טווח.
קוד C++
קוד C++

מסקנה

זה מסיים את התיאור של scanf C. זוהי תכונה שימושית נחמדה לעבודה בתוכניות קטנות ובעת שימוש בשיטת התכנות הפרוצדורלית. עם זאת, החיסרון העיקרי הוא מספר השגיאות הבלתי צפויות שיכולות להתרחש בעת שימוש ב- scanf. לכן, התיאור של scanf C בעת התכנות נשמר לנגד עיניך. בפרויקטים מקצועיים גדולים משתמשים ב-iostreams, בשל העובדה שיש להם יכולות ברמה גבוהה יותר, הם מסוגלים יותר לתפוס ולטפל בשגיאות, וגם לעבוד עם כמויות מידע משמעותיות. יש לציין גם שהתיאור של scanf C ברוסית זמין במקורות רשת רבים, כמו גם דוגמאות שלושימוש, עקב גיל הפונקציה. לכן, במידת הצורך, תמיד תוכל למצוא את התשובה בפורומים הנושאים.

מוּמלָץ: