1 00:00:00,000 --> 00:00:02,490 [Powered by Google Translate] [مكتبة CS50] 2 00:00:02,490 --> 00:00:04,220 [نيت Hardison] [جامعة هارفارد] 3 00:00:04,220 --> 00:00:07,260 [هذا CS50. CS50.TV] 4 00:00:07,260 --> 00:00:11,510 مكتبة CS50 هو أداة مفيدة أننا تم تثبيتها على الجهاز 5 00:00:11,510 --> 00:00:15,870 لجعله أسهل بالنسبة لك لكتابة برامج يمكن للمستخدمين لإدخال الأوامر. 6 00:00:15,870 --> 00:00:21,670 في هذا الفيديو، سنقوم بسحب الستار وننظر إلى ما هو بالضبط في مكتبة CS50. 7 00:00:21,670 --> 00:00:25,520 >> في مكتبات الفيديو على C، نتحدث عن كيفية تضمين ملفات رؤوس # 8 00:00:25,520 --> 00:00:27,570 من المكتبة في التعليمات البرمجية المصدر، 9 00:00:27,570 --> 00:00:31,150 ثم قمت بربط مع ملف مكتبة ثنائي أثناء مرحلة ربط 10 00:00:31,150 --> 00:00:33,140 عملية تجميع. 11 00:00:33,140 --> 00:00:36,440 تحديد الملفات رأس واجهة المكتبة. 12 00:00:36,440 --> 00:00:41,280 أي أنها التفاصيل كافة الموارد التي تتوفر لديها مكتبة لتتمكن من استخدامها، 13 00:00:41,280 --> 00:00:45,250 مثل الإعلانات وظيفة، والثوابت، وأنواع البيانات. 14 00:00:45,250 --> 00:00:48,890 ملف مكتبة ثنائي يحتوي على تنفيذ المكتبة، 15 00:00:48,890 --> 00:00:54,580 يتم تصنيف الملفات التي من رأس مكتبة ومكتبة لل. شفرة المصدر الملفات ج. 16 00:00:54,580 --> 00:00:59,820 >> ملف مكتبة ثنائي ليست مثيرة جدا للاهتمام أن ننظر إلى أنه منذ، حسنا، في ثنائي. 17 00:00:59,820 --> 00:01:03,300 لذلك، دعونا نلقي نظرة على رأس الملفات للمكتبة بدلا من ذلك. 18 00:01:03,300 --> 00:01:07,710 في هذه الحالة، هناك ملف واحد فقط يسمى رأس cs50.h. 19 00:01:07,710 --> 00:01:11,040 لقد تثبيته في دليل المستخدم وتشمل الدليل 20 00:01:11,040 --> 00:01:15,150 جنبا إلى جنب مع ملفات رأس النظام المكتبات الأخرى. 21 00:01:15,150 --> 00:01:21,530 >> واحد من أول الأشياء التي ستلاحظ هو أن يشمل cs50.h # الملفات رأس من المكتبات الأخرى - 22 00:01:21,530 --> 00:01:25,670 تعويم، وحدود، BOOL القياسية، وليب القياسية. 23 00:01:25,670 --> 00:01:28,800 مرة أخرى، وفقا لمبدأ لا إعادة اختراع العجلة، 24 00:01:28,800 --> 00:01:33,490 لقد قمنا ببناء مكتبة CS0 باستخدام الأدوات التي قدمت لنا الأخرى. 25 00:01:33,490 --> 00:01:38,690 >> والشيء التالي الذي سوف نرى في المكتبة هو أن نحدد نوع جديد يسمى "سلسلة". 26 00:01:38,690 --> 00:01:42,330 هذا الخط فقط حقا يخلق مستعار لنوع * شار، 27 00:01:42,330 --> 00:01:46,000 لذلك لا سحرية إضفاء نوع سلسلة جديدة مع سمات 28 00:01:46,000 --> 00:01:49,650 يترافق عادة مع كائنات السلسلة في لغات أخرى، 29 00:01:49,650 --> 00:01:50,850 مثل الطول. 30 00:01:50,850 --> 00:01:55,180 السبب قمنا به هو لحماية هذه المبرمجين جديدة من الدموى من التفاصيل 31 00:01:55,180 --> 00:01:57,580 من المؤشرات حتى انهم على استعداد. 32 00:01:57,580 --> 00:02:00,130 >> الجزء التالي من ملف الرأس هو إعلان وظائف 33 00:02:00,130 --> 00:02:04,410 أن يوفر مكتبة CS50 جنبا إلى جنب مع الوثائق. 34 00:02:04,410 --> 00:02:06,940 لاحظ مستوى التفاصيل في هذه التعليقات هنا. 35 00:02:06,940 --> 00:02:10,560 هذا هو السوبر المهم جدا أن يعرف الناس كيفية استخدام هذه الوظائف. 36 00:02:10,560 --> 00:02:19,150 نعلن، بدوره، وظائف لمطالبة المستخدم وحرف العودة، الزوجي، يطفو، رجات، 37 00:02:19,150 --> 00:02:24,160 يتوق طويلة، وسلاسل، وذلك باستخدام لدينا نوع السلسلة الخاصة. 38 00:02:24,160 --> 00:02:26,260 وفقا لمبدأ الاختباء المعلومات، 39 00:02:26,260 --> 00:02:31,640 وضعنا تعريفنا في ملف منفصل تنفيذ ج - cs50.c-- 40 00:02:31,640 --> 00:02:35,110 تقع في دليل المستخدم المصدر. 41 00:02:35,110 --> 00:02:38,040 لقد قدمنا ​​هذا الملف بحيث يمكنك إلقاء نظرة على ذلك، 42 00:02:38,040 --> 00:02:41,490 نتعلم منها، وإعادة ترجمة على أجهزة مختلفة إذا كنت ترغب في ذلك، 43 00:02:41,490 --> 00:02:45,510 على الرغم من أننا نعتقد أنه من الأفضل للعمل على الأجهزة لهذه الفئة. 44 00:02:45,510 --> 00:02:47,580 على أي حال، دعونا نلقي نظرة على ذلك الآن. 45 00:02:49,020 --> 00:02:54,620 >> وظائف GetChar، GetDouble، GetFloat، GetInt، وGetLongLong 46 00:02:54,620 --> 00:02:58,160 كلها مبنية على أعلى من وظيفة GetString. 47 00:02:58,160 --> 00:03:01,510 تبين أنها تتبع أساسا عن نفس النمط. 48 00:03:01,510 --> 00:03:04,870 أنها تستخدم حلقة في حين مطالبة المستخدم لسطر واحد من المدخلات. 49 00:03:04,870 --> 00:03:08,430 أنها ترجع قيمة خاصة إذا كان المستخدم مدخلات سطر فارغ. 50 00:03:08,430 --> 00:03:11,750 أنها محاولة لتحليل إدخال المستخدم والنوع المناسب، 51 00:03:11,750 --> 00:03:15,010 سواء كان شار، ومزدوجة، وتطفو، الخ. 52 00:03:15,010 --> 00:03:18,710 وبعد ذلك يعود إما نتيجة إذا تم تحليل المدخلات بنجاح 53 00:03:18,710 --> 00:03:21,330 أو أنها reprompt المستخدم. 54 00:03:21,330 --> 00:03:24,230 >> على مستوى عال، لا يوجد شيء صعب حقا هنا. 55 00:03:24,230 --> 00:03:28,760 قد كنت قد كتبت رمز منظم وبالمثل نفسك في الماضي. 56 00:03:28,760 --> 00:03:34,720 ولعل الجزء الأكثر خفي المظهر هو الدعوة sscanf التي بتوزيع إدخال المستخدم. 57 00:03:34,720 --> 00:03:38,160 Sscanf هو جزء من الأسرة تحويل المدخلات الشكل. 58 00:03:38,160 --> 00:03:42,300 أنه يعيش في io.h القياسية، وظيفتها هي تحليل سلسلة C، 59 00:03:42,300 --> 00:03:46,520 وفقا لشكل معين، وتخزين نتائج التحليل في متغير 60 00:03:46,520 --> 00:03:48,720 المقدمة من الطالب. 61 00:03:48,720 --> 00:03:53,570 منذ دالات تحويل نسق إدخال مفيدة جدا، وظائف على نطاق واسع 62 00:03:53,570 --> 00:03:56,160 التي ليست بديهية فائقة في البداية، 63 00:03:56,160 --> 00:03:58,300 سنذهب حول كيفية sscanf يعمل. 64 00:03:58,300 --> 00:04:03,330 >> الوسيطة الأولى هي لsscanf * شار - مؤشر إلى حرف. 65 00:04:03,330 --> 00:04:05,150 للدالة للعمل بشكل صحيح، 66 00:04:05,150 --> 00:04:08,340 يجب أن يكون الحرف الحرف الأول من سلسلة C، 67 00:04:08,340 --> 00:04:12,270 إنهاء الطابع فارغة 0 \. 68 00:04:12,270 --> 00:04:15,120 هذه هي السلسلة لتحليل 69 00:04:15,120 --> 00:04:18,269 الوسيطة الثانية إلى sscanf هو سلسلة تنسيق، 70 00:04:18,269 --> 00:04:20,839 مرت عادة في وثابت السلسلة، 71 00:04:20,839 --> 00:04:24,040 وقد رأيتم سلسلة مثل هذا من قبل عند استخدام printf. 72 00:04:24,040 --> 00:04:28,650 علامة النسبة المئوية في سلسلة التنسيق يشير محدد التحويل. 73 00:04:28,650 --> 00:04:30,850 الحرف مباشرة بعد علامة النسبة المئوية، 74 00:04:30,850 --> 00:04:35,430 يشير إلى نوع C التي نريد ان تتحول الى sscanf. 75 00:04:35,430 --> 00:04:40,090 في GetInt، ترى أن هناك د ج٪ و٪. 76 00:04:40,090 --> 00:04:48,690 هذا يعني أن sscanf سيحاول الباحث إلى عشري - د٪ - وشار أ - ج٪. 77 00:04:48,690 --> 00:04:51,510 لكل محدد التحويل في سلسلة التنسيق، 78 00:04:51,510 --> 00:04:56,620 sscanf تتوقع حجة المقابلة في وقت لاحق في قائمة حجتها. 79 00:04:56,620 --> 00:05:00,850 يجب أن نشير إلى حجة مكان مناسب مكتوب 80 00:05:00,850 --> 00:05:04,000 لتخزين نتيجة التحويل. 81 00:05:04,000 --> 00:05:08,910 >> الطريقة المثالية لتحقيق ذلك هو إنشاء متغير على كومة قبل استدعاء sscanf 82 00:05:08,910 --> 00:05:11,440 لكل عنصر الذي تريد تحليل من السلسلة 83 00:05:11,440 --> 00:05:15,520 ثم استخدم عنوان المشغل - والعطف - لتمرير مؤشرات 84 00:05:15,520 --> 00:05:19,100 لهذه المتغيرات لدعوة sscanf. 85 00:05:19,100 --> 00:05:22,720 يمكنك أن ترى أن في GetInt نقوم به بالضبط هذا. 86 00:05:22,720 --> 00:05:28,240 الحق قبل استدعاء sscanf، نعلن ودعا الباحث ن ج الدعوة وشار على المكدس، 87 00:05:28,240 --> 00:05:32,340 ونحن نمر مؤشرات لهم في الدعوة sscanf. 88 00:05:32,340 --> 00:05:35,800 ويفضل وضع هذه المتغيرات في بنية تخزين العناصر على استخدام المساحة المخصصة 89 00:05:35,800 --> 00:05:39,350 على كومة مع malloc، وبما انك تجنب النفقات العامة من الدعوة malloc، 90 00:05:39,350 --> 00:05:43,060 وكنت لا داعي للقلق حول تسرب الذاكرة. 91 00:05:43,060 --> 00:05:47,280 أحرف لا مسبوقة بعلامة النسبة المئوية لا يدفع التحويل. 92 00:05:47,280 --> 00:05:50,380 بل مجرد إضافة لمواصفات الشكل. 93 00:05:50,380 --> 00:05:56,500 >> على سبيل المثال، إذا كانت السلسلة في شكل GetInt كانت د٪ بدلا من ذلك، 94 00:05:56,500 --> 00:05:59,800 وsscanf البحث عن هذه الرسالة في يعقبه الباحث، 95 00:05:59,800 --> 00:06:04,360 وعلى الرغم من أنه سيكون محاولة لتحويل كثافة العمليات، فإنه لن تفعل أي شيء آخر مع أحد. 96 00:06:04,360 --> 00:06:07,440 والاستثناء الوحيد لهذا هو بيضاء. 97 00:06:07,440 --> 00:06:11,030 حرف مسافة بيضاء في سلسلة التنسيق تطابق اي مبلغ بيضاء - 98 00:06:11,030 --> 00:06:12,890 لا شيء على الإطلاق. 99 00:06:12,890 --> 00:06:18,100 لذلك، لهذا السبب ربما يذكر التعليق مع كبار و / أو المرتبة بيضاء. 100 00:06:18,100 --> 00:06:22,910 لذلك، في هذه المرحلة سوف يبدو لنا دعوة sscanf محاولة تحليل سلسلة للمستخدم إدخال 101 00:06:22,910 --> 00:06:25,380 عن طريق التحقق من الممكن بيضاء الرائدة، 102 00:06:25,380 --> 00:06:29,300 تليها الباحث أنه سيتم تحويلها وتخزينها في متغير ن الباحث 103 00:06:29,300 --> 00:06:33,090 تليها بعض كمية بيضاء، وتليها حرف 104 00:06:33,090 --> 00:06:35,810 ج المخزنة في المتغير شار. 105 00:06:35,810 --> 00:06:37,790 >> وماذا عن قيمة المقابل؟ 106 00:06:37,790 --> 00:06:41,560 سوف Sscanf تحليل سطر الإدخال من البداية إلى النهاية، 107 00:06:41,560 --> 00:06:44,860 وقف عندما يصل إلى نهاية أو عند حرف في الإدخال 108 00:06:44,860 --> 00:06:49,320 لا يطابق شكل حرف أو عندما لا يمكن إجراء تحويل. 109 00:06:49,320 --> 00:06:52,690 يتم استخدام القيمة انها العودة الى واحد عند توقف. 110 00:06:52,690 --> 00:06:55,670 إذا توقفت عن ذلك، لأنه وصل إلى نهاية سلسلة الإدخال 111 00:06:55,670 --> 00:07:00,630 قبل اتخاذ أي تحويلات وقبل الفشل في تطابق جزء من سلسلة التنسيق، 112 00:07:00,630 --> 00:07:04,840 ثم يتم إرجاع EOF خاصة ثابتة. 113 00:07:04,840 --> 00:07:08,200 خلاف ذلك، فإنها ترجع عدد التحويلات الناجحة، 114 00:07:08,200 --> 00:07:14,380 والتي يمكن أن تكون 0 أو 1 أو 2، منذ طلبنا لمدة التحويلات. 115 00:07:14,380 --> 00:07:19,000 في حالتنا، ونحن نريد أن نتأكد من أن المستخدم بكتابتها في الباحث والباحث فقط. 116 00:07:19,000 --> 00:07:23,370 >> لذلك، ونحن نريد العودة sscanf 1. ترى لماذا؟ 117 00:07:23,370 --> 00:07:26,850 إذا عاد sscanf 0، ثم لم تجر التحويلات، 118 00:07:26,850 --> 00:07:31,690 وبالتالي فإن المستخدم كتابة شيء آخر غير عدد صحيح في بداية الإدخال. 119 00:07:31,690 --> 00:07:37,100 إذا sscanf بإرجاع 2، ثم لم اكتب المستخدم بشكل صحيح في في بداية المدخل، 120 00:07:37,100 --> 00:07:41,390 لكنها كتبت بعد ذلك في بعض الحرف غير بيضاء بعد ذلك 121 00:07:41,390 --> 00:07:44,940 منذ نجحت ج٪ التحويل. 122 00:07:44,940 --> 00:07:49,570 نجاح باهر، وهذا لا بأس به شرحا مطولا لاستدعاء دالة واحدة. 123 00:07:49,570 --> 00:07:53,460 على أي حال، إذا كنت تريد المزيد من المعلومات عن sscanf والأشقاء والخمسين، 124 00:07:53,460 --> 00:07:57,130 إطلاعك على صفحات الرجل، وجوجل، أو كليهما. 125 00:07:57,130 --> 00:07:58,780 هناك الكثير من الخيارات سلسلة التنسيق، 126 00:07:58,780 --> 00:08:03,830 ويمكن لهذه توفر لك الكثير من العمل اليدوي عند محاولة تحليل السلاسل في C. 127 00:08:03,830 --> 00:08:07,180 >> وظيفة النهائي في المكتبة هو أن ننظر إلى GetString. 128 00:08:07,180 --> 00:08:10,310 تبين أن GetString هي وظيفة صعبة للكتابة بشكل صحيح، 129 00:08:10,310 --> 00:08:14,290 حتى وإن كانت تبدو مثل هذه المهمة، بسيطة المشترك. 130 00:08:14,290 --> 00:08:16,170 لماذا هذا هو الحال؟ 131 00:08:16,170 --> 00:08:21,380 حسنا، دعونا نفكر في كيفية ونحن في طريقنا لتخزين السطر الذي يقوم المستخدم بكتابة فيها 132 00:08:21,380 --> 00:08:23,880 منذ سلسلة هو سلسلة من حرف، 133 00:08:23,880 --> 00:08:26,430 ونحن قد ترغب في تخزينه في مجموعة على المكدس، 134 00:08:26,430 --> 00:08:31,250 ولكننا بحاجة إلى معرفة كم من الوقت مجموعة ستكون عندما نعلن ذلك. 135 00:08:31,250 --> 00:08:34,030 وبالمثل، إذا كنا نريد لوضعها على كومة، 136 00:08:34,030 --> 00:08:38,090 نحن بحاجة لتمريرها إلى malloc عدد وحدات البايت نريد أن الاحتياطي، 137 00:08:38,090 --> 00:08:39,730 ولكن هذا أمر مستحيل. 138 00:08:39,730 --> 00:08:42,760 ليست لدينا فكرة عن عدد أحرف المستخدم سوف اكتب في 139 00:08:42,760 --> 00:08:46,590 قبل المستخدم في الواقع لا كتابتها. 140 00:08:46,590 --> 00:08:50,720 >> A حل ساذج لهذه المشكلة هو فقط لحجز جزءا كبيرا من المساحة، ويقول، 141 00:08:50,720 --> 00:08:54,540 كتلة من 1000 حرف لإدخال المستخدم، 142 00:08:54,540 --> 00:08:57,980 على افتراض أن المستخدم لن اكتب في سلسلة طويلة. 143 00:08:57,980 --> 00:09:00,810 هذا هو فكرة سيئة لسببين. 144 00:09:00,810 --> 00:09:05,280 أولا، على افتراض أن المستخدمين عادة لا اكتب في سلاسل طويلة، 145 00:09:05,280 --> 00:09:07,610 هل يمكن أن تضيع الكثير من الذاكرة. 146 00:09:07,610 --> 00:09:10,530 على الأجهزة الحديثة، وهذا قد لا يكون مشكلة إذا قمت بذلك 147 00:09:10,530 --> 00:09:13,890 في واحد أو اثنين حالات معزولة، 148 00:09:13,890 --> 00:09:17,630 ولكن إذا كنت تتناولين إدخال المستخدم في حلقة وتخزين لاستخدامها لاحقا، 149 00:09:17,630 --> 00:09:20,870 يمكنك تمتص بسرعة من نصف طن من الذاكرة. 150 00:09:20,870 --> 00:09:24,450 بالإضافة إلى ذلك، إذا كان البرنامج كنت تكتب هي لأصغر كمبيوتر - 151 00:09:24,450 --> 00:09:28,100 جهاز الهاتف الذكي مثل أو أي شيء آخر مع ذاكرة محدودة - 152 00:09:28,100 --> 00:09:32,060 هذا الحل سوف يسبب مشاكل على نحو أسرع كثيرا. 153 00:09:32,060 --> 00:09:36,450 الثانية، والسبب الأكثر خطورة لعدم القيام بذلك هو أنه يترك البرنامج الخاص بك عرضة 154 00:09:36,450 --> 00:09:39,710 لما يسمى هجوم تجاوز سعة المخزن المؤقت. 155 00:09:39,710 --> 00:09:45,840 في البرمجة، وهو المخزن المؤقت الذاكرة المستخدمة لتخزين مؤقتا الإدخال أو الإخراج البيانات، 156 00:09:45,840 --> 00:09:48,980 وهو في هذه الحالة هو لدينا 1000-شار كتلة. 157 00:09:48,980 --> 00:09:53,370 A تجاوز سعة المخزن المؤقت يحدث عندما تتم كتابة البيانات بعد نهاية الكتلة. 158 00:09:53,370 --> 00:09:57,790 >> على سبيل المثال، إذا قام مستخدم في الواقع لا في نوع أكثر من 1000 حرف. 159 00:09:57,790 --> 00:10:01,570 قد شهدت لك هذا الخطأ أثناء البرمجة مع المصفوفات. 160 00:10:01,570 --> 00:10:05,620 إذا كان لديك مجموعة من 10 رجات، لا شيء يمنعك من محاولة القراءة أو الكتابة 161 00:10:05,620 --> 00:10:07,810 كثافة العمليات 15. 162 00:10:07,810 --> 00:10:10,000 لا توجد تحذيرات أو أخطاء مترجم. 163 00:10:10,000 --> 00:10:13,250 برنامج اخطاء فقط إلى الأمام مباشرة ويصل إلى ذاكرة 164 00:10:13,250 --> 00:10:18,150 حيث يعتقد الباحث سوف يكون 15، وهذا يمكن أن الكتابة المتغيرات الأخرى الخاصة بك. 165 00:10:18,150 --> 00:10:22,040 في أسوأ الحالات، يمكنك الكتابة فوق بعض الداخلي البرنامج الخاص بك 166 00:10:22,040 --> 00:10:26,820 آليات الرقابة، مما تسبب في البرنامج الخاص لتنفيذ تعليمات فعلا مختلفة 167 00:10:26,820 --> 00:10:28,340 من يقصد لك. 168 00:10:28,340 --> 00:10:31,360 >> الآن، انها ليست مشتركة للقيام بذلك بطريق الخطأ، 169 00:10:31,360 --> 00:10:35,150 ولكن هذا هو أسلوب شائع إلى حد كبير أن الأشرار استخدام برامج لكسر 170 00:10:35,150 --> 00:10:39,080 ووضع تعليمات برمجية ضارة على أجهزة الكمبيوتر الآخرين. 171 00:10:39,080 --> 00:10:42,910 ولذلك، فإننا لا نستطيع مجرد استخدام لدينا حل ساذج. 172 00:10:42,910 --> 00:10:45,590 نحن بحاجة إلى وسيلة لمنع برامجنا من أن تكون عرضة 173 00:10:45,590 --> 00:10:47,880 إلى المخزن مؤقت هجوم تجاوز. 174 00:10:47,880 --> 00:10:51,430 للقيام بذلك، نحن بحاجة للتأكد من أن المخزن المؤقت لدينا يمكن أن تنمو كما قرأنا 175 00:10:51,430 --> 00:10:53,850 المزيد من المدخلات من المستخدم. 176 00:10:53,850 --> 00:10:57,440 الحل؟ نستخدم العازلة المخصصة الكومة. 177 00:10:57,440 --> 00:10:59,950 لأننا يمكن تغيير حجمها باستخدام تغيير الحجم وظيفة realloc، 178 00:10:59,950 --> 00:11:04,580 ونحن تتبع رقمين - مؤشر فتحة فارغة المقبل في المخزن المؤقت 179 00:11:04,580 --> 00:11:08,390 وطول أو قدرة المخزن المؤقت. 180 00:11:08,390 --> 00:11:13,210 نقرأ في حرف من مستخدم واحد في وقت واحد باستخدام وظيفة fgetc. 181 00:11:13,210 --> 00:11:19,360 حجة وظيفة fgetc يأخذ - ستدين - هو إشارة إلى سلسلة الإدخال القياسية، 182 00:11:19,360 --> 00:11:23,810 وهو قناة الإدخال preconnected التي تستخدم لنقل إدخال المستخدم 183 00:11:23,810 --> 00:11:26,270 من محطة إلى البرنامج. 184 00:11:26,270 --> 00:11:29,890 >> عندما يقوم المستخدم أنواع في شخصية جديدة، ونحن تحقق لمعرفة ما إذا كان مؤشر 185 00:11:29,890 --> 00:11:35,810 من فتحة الحرة المقبل زائد 1 هو أكبر من قدرة المخزن المؤقت. 186 00:11:35,810 --> 00:11:39,690 و+1 يأتي في أنه إذا كان مؤشر المقبل الحرة 5، 187 00:11:39,690 --> 00:11:44,150 ثم يجب طول المخزن المؤقت يكون لدينا 6 شكرا إلى 0 الفهرسة. 188 00:11:44,150 --> 00:11:48,350 إذا كنا قد نفدت مساحة في المخزن المؤقت، ثم نحاول تغيير حجمه، 189 00:11:48,350 --> 00:11:51,690 مضاعفة ذلك حتى يتسنى لنا خفض عدد المرات التي نقوم بتغيير حجم 190 00:11:51,690 --> 00:11:54,760 إذا كان المستخدم هو كتابة في سلسلة طويلة حقا. 191 00:11:54,760 --> 00:11:57,950 إذا كانت السلسلة قد حصلت طويلة جدا أو إذا كنا نفاد الذاكرة الكومة، 192 00:11:57,950 --> 00:12:01,350 نحن لدينا وتحرير عازلة خالية العودة. 193 00:12:01,350 --> 00:12:04,170 >> وأخيرا، فإننا إلحاق شار إلى المخزن المؤقت. 194 00:12:04,170 --> 00:12:08,200 وبمجرد أن يضرب المستخدم إدخال أو العودة، مما يشير إلى سطر جديد، 195 00:12:08,200 --> 00:12:12,050 أو الاستثنائية شار - التحكم د - مما يشير إلى نهاية الإدخال، 196 00:12:12,050 --> 00:12:16,240 نحن نفعل تحقق لمعرفة ما إذا كان المستخدم كتابتها في الواقع أي شيء على الإطلاق. 197 00:12:16,240 --> 00:12:18,820 إن لم يكن، نعود فارغة. 198 00:12:18,820 --> 00:12:22,280 خلاف ذلك، وذلك لأن لدينا العازلة قد يكون أكبر مما نحتاج، 199 00:12:22,280 --> 00:12:24,830 في أسوأ الحالات انها تقريبا ضعفي نحن بحاجة 200 00:12:24,830 --> 00:12:27,830 لأننا في كل مرة كنا مضاعفة حجم، 201 00:12:27,830 --> 00:12:31,840 نحن جعل نسخة جديدة من السلسلة فقط باستخدام مقدار المساحة التي نحتاجها. 202 00:12:31,840 --> 00:12:34,220 نضيف بين 1 اضافية لدعوة malloc، 203 00:12:34,220 --> 00:12:37,810 ذلك أن هناك مساحة للطابع خاص فاصل فارغة - و\ 0، 204 00:12:37,810 --> 00:12:41,990 ونحن إلحاق إلى السلسلة مرة واحدة ونحن نسخ في بقية الأحرف، 205 00:12:41,990 --> 00:12:45,060 باستخدام strncpy بدلا من strcpy 206 00:12:45,060 --> 00:12:48,830 بحيث لا يمكننا تحديد بالضبط عدد أحرف نريد نسخها. 207 00:12:48,830 --> 00:12:51,690 نسخ Strcpy حتى يضرب \ 0. 208 00:12:51,690 --> 00:12:55,740 ثم نحرر عازلة لدينا نسخة والعودة إلى الطالب. 209 00:12:55,740 --> 00:12:59,840 >> يعرف الذين يمكن هذه الوظيفة بسيطة ما يبدو معقدة جدا؟ 210 00:12:59,840 --> 00:13:02,820 الآن أنت تعرف ما يدور في المكتبة CS50. 211 00:13:02,820 --> 00:13:06,470 >> اسمي نيت Hardison، وهذا هو CS50. 212 00:13:06,470 --> 00:13:08,350 [CS50.TV]