1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> 1 SPEAKER: בואו לכתוב תכנית ש מקבל מחרוזת מהמשתמש ללא 3 00:00:02,920 --> 00:00:05,700 באמצעות CS50 הספרייה לתפקד GetString. 4 00:00:05,700 --> 00:00:08,720 כדי לעשות זאת, נצטרך להמשיך ולהשתמש scanf, הפונקציה שGetString 5 00:00:08,720 --> 00:00:10,950 פונקציה משתמשת למעשה מתחת למכסת המנוע. 6 00:00:10,950 --> 00:00:13,780 אבל אני הולך לעשות את זה במכוון בצורה עגלה. 7 00:00:13,780 --> 00:00:17,230 אני הולך לעשות בצורה שאני חושב יהיה נכון, אבל מסתבר ש 8 00:00:17,230 --> 00:00:19,380 ההנחה שלי הולכת להיות די, די פגום. 9 00:00:19,380 --> 00:00:20,800 ואכן, די מסוכן. 10 00:00:20,800 --> 00:00:24,750 בגלל באגים כמו זה שאני עומד להפוך את יכול להיות מנוצל על ידי יריבים 11 00:00:24,750 --> 00:00:28,870 כך שהמחשב שלך או התכנית שלך ניתן לקחת על פוטנציאל. 12 00:00:28,870 --> 00:00:30,200 >> בואו נתחיל באופן הבא. 13 00:00:30,200 --> 00:00:33,540 ראשית בואו נכריז על המחרוזת שלנו, הידוע כיום ככוכב char, 14 00:00:33,540 --> 00:00:34,750 וקורא לזה. 15 00:00:34,750 --> 00:00:39,400 בוא הבא לבקש מהמשתמש מחרוזת, כמו עם "מחרוזת בבקשה." ו - 16 00:00:39,400 --> 00:00:44,250 בואו עכשיו לקבל המחרוזת מהמשתמש באמצעות scanf, סוף הציטוט, "% s". בתוך 17 00:00:44,250 --> 00:00:47,760 מילות אחרות, בואו להודיע ​​לנו שscanf אין למעשה מצפה לקבל מחרוזת 18 00:00:47,760 --> 00:00:48,630 מהמשתמש. 19 00:00:48,630 --> 00:00:50,810 >> אבל עכשיו אנחנו צריכים להגיד scanf דבר אחד נוסף - 20 00:00:50,810 --> 00:00:53,350 איפה לשים את המחרוזת ש המשתמש מספק. 21 00:00:53,350 --> 00:00:57,840 ובכן, אני הולך די פשוט להתחיל עם הפסיק של, ציון שאני רוצה 22 00:00:57,840 --> 00:00:59,320 scanf לשים את המחרוזת שם. 23 00:00:59,320 --> 00:01:04,818 אני הבא אני הולך להדפיס משהו כמו הודות printf "ל% s 24 00:01:04,818 --> 00:01:10,670 פסיק n הלוכסן ההפוך. "וכמו תמיד, אני הולך לעבור במחרוזת, s. 25 00:01:10,670 --> 00:01:14,920 עכשיו בואו להציל, לקמפל ולהריץ את זה תכנית, ולראות אם אנחנו לא יכולים לגרום 26 00:01:14,920 --> 00:01:16,590 הבעיה שאני חזיתי. 27 00:01:16,590 --> 00:01:18,650 >> הפוך scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 מחרוזת בבקשה. 30 00:01:21,830 --> 00:01:25,540 בואו לספק משהו כמו, "שלום". "תודה על האפס". הממ, זה לא 31 00:01:25,540 --> 00:01:26,750 מה שציפיתי. 32 00:01:26,750 --> 00:01:28,240 אז מה קורה כאן? 33 00:01:28,240 --> 00:01:32,040 >> ובכן, מתברר כי אנחנו הכריזו ים ככוכב char אבל אנחנו לא 34 00:01:32,040 --> 00:01:36,120 למעשה מאוחסן ים בכתובת של נתח ממשי של זיכרון, scanf לא 35 00:01:36,120 --> 00:01:38,940 יש מקום לשים את המחרוזת שמשתמש הקליד פנימה 36 00:01:38,940 --> 00:01:42,510 ואכן, אם המשתמש היה להקליד בחברה מחרוזת ארוכה הרבה יותר מאשר "שלום", 37 00:01:42,510 --> 00:01:46,780 למשל כמה שורות של טקסט או כמה פסקאות של טקסט, זה די 38 00:01:46,780 --> 00:01:50,280 אפשרי שאנו עלולים לגרום מה שנקרא באשמת פילוח. 39 00:01:50,280 --> 00:01:53,570 >> בגלל scanf לא הולך לדעת כי אני ממש לא צריך לשים את כתובת 40 00:01:53,570 --> 00:01:54,610 בתוך ים. 41 00:01:54,610 --> 00:01:58,000 במקום זאת, הוא הולך לראות כמה ערך בים, חתיכות כמה דפוס שעשוי 42 00:01:58,000 --> 00:02:00,910 להיות טוב מאוד ערך אשפה, שם רק במקרה. 43 00:02:00,910 --> 00:02:04,600 וscanf עדיין הולך לנסות לכתוב מחרוזת המשתמשים לכתובת זו, 44 00:02:04,600 --> 00:02:08,789 גם אם הוא ערך זבל, אשר אכן יכול לגרום להתרסקות. 45 00:02:08,789 --> 00:02:10,130 >> אז איך אנחנו הולכים לתקן את זה? 46 00:02:10,130 --> 00:02:12,523