קלט מחרוזת באמצעות scanf
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 14 מתוך 63.
עכשיו, אחרי שהבנת איך מחרוזות פועלות עם תו הסיום null, הגיע הזמן ללמוד איך לקבל קלט של מחרוזות ממשתמשים. הפונקציה scanf יכולה לקרוא מחרוזות באמצעות מציין הפורמט %s, אבל יש לה מגבלות חשובות שחשוב להבין.
כדי לקרוא מחרוזת באמצעות scanf, משתמשים בתבנית %s ומעבירים את השם של מערך התווים (בלי האופרטור &, מכיוון ששמות של מערכים הם כבר כתובות):
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);עם זאת, ל-scanf("%s", ...) יש מגבלה קריטית: הוא מפסיק לקרוא ברגע שהוא נתקל בתו רווח לבן כלשהו (רווח, טאב או שורה חדשה). כלומר, אם משתמש מקליד "Hello World", scanf ילכוד רק את "Hello" וישאיר את "World" במאגר הקלט.
חשש רציני נוסף הוא ש־scanf לא בודקת אם הקלט נכנס למערך שלך. אם מישהו יזין מילה ארוכה יותר ממה שהמערך שלך יכול להכיל, הדבר יגרום לגלישת מאגר, שעלולה לגרום לקריסת התוכנית שלך או ליצור פרצות אבטחה. הקפד תמיד שמערך התווים שלך יהיה גדול מספיק עבור הקלט הצפוי.
למרות המגבלות האלה, scanf("%s", ...) מתאימה בהחלט לקריאת מילים בודדות, וזה בדיוק מה שתתרגלו באתגר הבא.
אתגר
קלכתוב תוכנית C שמדגימה קריאת קלט של מחרוזות מהמשתמש באמצעות scanf והצגתו בחזרה. התוכנית שלך צריכה:
- להכריז על מערך תווים בשם
usernameעם 30 איברים כדי לאחסן את קלט המשתמש - להכריז על מערך תווים בשם
hobbyעם 25 איברים כדי לאחסן קלט נוסף - להשתמש ב-
printfכדי להציג למשתמש את ההודעה "Enter your username:" - להשתמש ב-
scanfעם מציין הפורמט%sכדי לקרוא את שם המשתמש לתוך מערךusername - להשתמש ב-
printfכדי להציג למשתמש את ההודעה "Enter your hobby:" - להשתמש ב-
scanfעם מציין הפורמט%sכדי לקרוא את התחביב לתוך מערךhobby - להדפיס את שתי המחרוזות באמצעות
printfבדיוק בפורמט שמוצג למטה
הקלט יסופק כשתי מילים נפרדות (ללא רווחים בתוך כל מילה).
הפלט שלך צריך להציג את התוצאות בפורמט הבא:
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!לדוגמה, אם המשתמש מזין את "Alice" כשם המשתמש ואת "reading" כתחביב, הפלט צריך להיות:
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!האתגר הזה בודק את ההבנה שלך בשימוש ב-scanf עם מציין הפורמט %s לקריאת קלט של מחרוזת, בהכרזה נכונה על מערך תווים בגודל מספיק, ובשילוב קלט המשתמש עם פלט מעוצב באמצעות printf.
נסו בעצמכם
#include <stdio.h>
int main() {
// TODO: הגדירו כאן את מערכי התווים שלכם
// TODO: כתבו כאן את הקוד שלכם להצגת בקשה לקלט ולקריאת הקלט
// TODO: הדפיסו את הודעת הפלט הסופית
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1יסודות המצביעים
מהו מצביע?הכרזה על מצביעיםאופרטור לקיחת הכתובת (&)אופרטור ביטול ההפניה (*)מצביעי NULLסיכום: יסודות המצביעים2מצביעים ומערכים
שמות מערכים כמצביעיםאיברי מערך ומצביעיםאריתמטיקה של מצביעיםהשוואת מצביעיםסיכום: מעבר על מערך באמצעות מצביעים5מצביעים ופונקציות
העברה לפי ערךהעברת מצביעים לפונקציותשינוי משתנים באמצעות מצביעיםדוגמה קלאסית: החלפההעברת מערכים לפונקציותחזרה: ארגומנטים של מצביעי פונקציה3מערכי תווים ומחרוזות
מחרוזות כמערכי charתו הסיום nullקלט מחרוזת באמצעות scanfשימוש ב־strlen()שימוש ב־strcpy()שימוש ב־strcat()שימוש ב־strcmp()סיכום: פונקציות מחרוזת בסיסיותתרגלו בעצמכם: קומפיילר C אונליין