>> 1 SPEAKER: בואו לכתוב תכנית ש מקבל מחרוזת מהמשתמש ללא
באמצעות CS50 הספרייה לתפקד GetString.
כדי לעשות זאת, נצטרך להמשיך ולהשתמש scanf, הפונקציה שGetString
פונקציה משתמשת למעשה מתחת למכסת המנוע.
אבל אני הולך לעשות את זה במכוון בצורה עגלה.
אני הולך לעשות בצורה שאני חושב יהיה נכון, אבל מסתבר ש
ההנחה שלי הולכת להיות די, די פגום.
ואכן, די מסוכן.
בגלל באגים כמו זה שאני עומד להפוך את יכול להיות מנוצל על ידי יריבים
כך שהמחשב שלך או התכנית שלך ניתן לקחת על פוטנציאל.
>> בואו נתחיל באופן הבא.
ראשית בואו נכריז על המחרוזת שלנו, הידוע כיום ככוכב char,
וקורא לזה.
בוא הבא לבקש מהמשתמש מחרוזת, כמו עם "מחרוזת בבקשה." ו -
בואו עכשיו לקבל המחרוזת מהמשתמש באמצעות scanf, סוף הציטוט, "% s". בתוך
מילות אחרות, בואו להודיע ​​לנו שscanf אין למעשה מצפה לקבל מחרוזת
מהמשתמש.
>> אבל עכשיו אנחנו צריכים להגיד scanf דבר אחד נוסף -
איפה לשים את המחרוזת ש המשתמש מספק.
ובכן, אני הולך די פשוט להתחיל עם הפסיק של, ציון שאני רוצה
scanf לשים את המחרוזת שם.
אני הבא אני הולך להדפיס משהו כמו הודות printf "ל% s
פסיק n הלוכסן ההפוך. "וכמו תמיד, אני הולך לעבור במחרוזת, s.
עכשיו בואו להציל, לקמפל ולהריץ את זה תכנית, ולראות אם אנחנו לא יכולים לגרום
הבעיה שאני חזיתי.
>> הפוך scanf-1.
./scanf-1.
מחרוזת בבקשה.
בואו לספק משהו כמו, "שלום". "תודה על האפס". הממ, זה לא
מה שציפיתי.
אז מה קורה כאן?
>> ובכן, מתברר כי אנחנו הכריזו ים ככוכב char אבל אנחנו לא
למעשה מאוחסן ים בכתובת של נתח ממשי של זיכרון, scanf לא
יש מקום לשים את המחרוזת שמשתמש הקליד פנימה
ואכן, אם המשתמש היה להקליד בחברה מחרוזת ארוכה הרבה יותר מאשר "שלום",
למשל כמה שורות של טקסט או כמה פסקאות של טקסט, זה די
אפשרי שאנו עלולים לגרום מה שנקרא באשמת פילוח.
>> בגלל scanf לא הולך לדעת כי אני ממש לא צריך לשים את כתובת
בתוך ים.
במקום זאת, הוא הולך לראות כמה ערך בים, חתיכות כמה דפוס שעשוי
להיות טוב מאוד ערך אשפה, שם רק במקרה.
וscanf עדיין הולך לנסות לכתוב מחרוזת המשתמשים לכתובת זו,
גם אם הוא ערך זבל, אשר אכן יכול לגרום להתרסקות.
>> אז איך אנחנו הולכים לתקן את זה?