1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> سرور 1: دعونا كتابة البرنامج الذي يحصل على سلسلة من المستخدم دون 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 دعونا أولا تعلن سلسلة لدينا، والمعروف الآن باسم نجم شار، 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 "شكرا لل٪ ق 24 00:01:04,818 --> 00:01:10,670 مائل ن فاصلة "، وكما هو الحال دائما، وأنا سوف تمر في سلسلة، ق. 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 >> كذلك، اتضح لأعلنا ق كنجم شار لكننا لم 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