[Powered by Google Translate] [مكتبة CS50]
[نيت Hardison] [جامعة هارفارد]
[هذا CS50. CS50.TV]
مكتبة CS50 هو أداة مفيدة أننا تم تثبيتها على الجهاز
لجعله أسهل بالنسبة لك لكتابة برامج يمكن للمستخدمين لإدخال الأوامر.
في هذا الفيديو، سنقوم بسحب الستار وننظر إلى ما هو بالضبط في مكتبة CS50.
>> في مكتبات الفيديو على C، نتحدث عن كيفية تضمين ملفات رؤوس #
من المكتبة في التعليمات البرمجية المصدر،
ثم قمت بربط مع ملف مكتبة ثنائي أثناء مرحلة ربط
عملية تجميع.
تحديد الملفات رأس واجهة المكتبة.
أي أنها التفاصيل كافة الموارد التي تتوفر لديها مكتبة لتتمكن من استخدامها،
مثل الإعلانات وظيفة، والثوابت، وأنواع البيانات.
ملف مكتبة ثنائي يحتوي على تنفيذ المكتبة،
يتم تصنيف الملفات التي من رأس مكتبة ومكتبة لل. شفرة المصدر الملفات ج.
>> ملف مكتبة ثنائي ليست مثيرة جدا للاهتمام أن ننظر إلى أنه منذ، حسنا، في ثنائي.
لذلك، دعونا نلقي نظرة على رأس الملفات للمكتبة بدلا من ذلك.
في هذه الحالة، هناك ملف واحد فقط يسمى رأس cs50.h.
لقد تثبيته في دليل المستخدم وتشمل الدليل
جنبا إلى جنب مع ملفات رأس النظام المكتبات الأخرى.
>> واحد من أول الأشياء التي ستلاحظ هو أن يشمل cs50.h # الملفات رأس من المكتبات الأخرى -
تعويم، وحدود، BOOL القياسية، وليب القياسية.
مرة أخرى، وفقا لمبدأ لا إعادة اختراع العجلة،
لقد قمنا ببناء مكتبة CS0 باستخدام الأدوات التي قدمت لنا الأخرى.
>> والشيء التالي الذي سوف نرى في المكتبة هو أن نحدد نوع جديد يسمى "سلسلة".
هذا الخط فقط حقا يخلق مستعار لنوع * شار،
لذلك لا سحرية إضفاء نوع سلسلة جديدة مع سمات
يترافق عادة مع كائنات السلسلة في لغات أخرى،
مثل الطول.
السبب قمنا به هو لحماية هذه المبرمجين جديدة من الدموى من التفاصيل
من المؤشرات حتى انهم على استعداد.
>> الجزء التالي من ملف الرأس هو إعلان وظائف
أن يوفر مكتبة CS50 جنبا إلى جنب مع الوثائق.
لاحظ مستوى التفاصيل في هذه التعليقات هنا.
هذا هو السوبر المهم جدا أن يعرف الناس كيفية استخدام هذه الوظائف.
نعلن، بدوره، وظائف لمطالبة المستخدم وحرف العودة، الزوجي، يطفو، رجات،
يتوق طويلة، وسلاسل، وذلك باستخدام لدينا نوع السلسلة الخاصة.
وفقا لمبدأ الاختباء المعلومات،
وضعنا تعريفنا في ملف منفصل تنفيذ ج - cs50.c--
تقع في دليل المستخدم المصدر.
لقد قدمنا ​​هذا الملف بحيث يمكنك إلقاء نظرة على ذلك،
نتعلم منها، وإعادة ترجمة على أجهزة مختلفة إذا كنت ترغب في ذلك،
على الرغم من أننا نعتقد أنه من الأفضل للعمل على الأجهزة لهذه الفئة.
على أي حال، دعونا نلقي نظرة على ذلك الآن.
>> وظائف GetChar، GetDouble، GetFloat، GetInt، وGetLongLong
كلها مبنية على أعلى من وظيفة GetString.
تبين أنها تتبع أساسا عن نفس النمط.
أنها تستخدم حلقة في حين مطالبة المستخدم لسطر واحد من المدخلات.
أنها ترجع قيمة خاصة إذا كان المستخدم مدخلات سطر فارغ.
أنها محاولة لتحليل إدخال المستخدم والنوع المناسب،
سواء كان شار، ومزدوجة، وتطفو، الخ.
وبعد ذلك يعود إما نتيجة إذا تم تحليل المدخلات بنجاح
أو أنها reprompt المستخدم.
>> على مستوى عال، لا يوجد شيء صعب حقا هنا.
قد كنت قد كتبت رمز منظم وبالمثل نفسك في الماضي.
ولعل الجزء الأكثر خفي المظهر هو الدعوة sscanf التي بتوزيع إدخال المستخدم.
Sscanf هو جزء من الأسرة تحويل المدخلات الشكل.
أنه يعيش في io.h القياسية، وظيفتها هي تحليل سلسلة C،
وفقا لشكل معين، وتخزين نتائج التحليل في متغير
المقدمة من الطالب.
منذ دالات تحويل نسق إدخال مفيدة جدا، وظائف على نطاق واسع
التي ليست بديهية فائقة في البداية،
سنذهب حول كيفية sscanf يعمل.
>> الوسيطة الأولى هي لsscanf * شار - مؤشر إلى حرف.
للدالة للعمل بشكل صحيح،
يجب أن يكون الحرف الحرف الأول من سلسلة C،
إنهاء الطابع فارغة 0 \.
هذه هي السلسلة لتحليل
الوسيطة الثانية إلى sscanf هو سلسلة تنسيق،
مرت عادة في وثابت السلسلة،
وقد رأيتم سلسلة مثل هذا من قبل عند استخدام printf.
علامة النسبة المئوية في سلسلة التنسيق يشير محدد التحويل.
الحرف مباشرة بعد علامة النسبة المئوية،
يشير إلى نوع C التي نريد ان تتحول الى sscanf.
في GetInt، ترى أن هناك د ج٪ و٪.
هذا يعني أن sscanf سيحاول الباحث إلى عشري - د٪ - وشار أ - ج٪.
لكل محدد التحويل في سلسلة التنسيق،
sscanf تتوقع حجة المقابلة في وقت لاحق في قائمة حجتها.
يجب أن نشير إلى حجة مكان مناسب مكتوب
لتخزين نتيجة التحويل.
>> الطريقة المثالية لتحقيق ذلك هو إنشاء متغير على كومة قبل استدعاء sscanf
لكل عنصر الذي تريد تحليل من السلسلة
ثم استخدم عنوان المشغل - والعطف - لتمرير مؤشرات
لهذه المتغيرات لدعوة sscanf.
يمكنك أن ترى أن في GetInt نقوم به بالضبط هذا.
الحق قبل استدعاء sscanf، نعلن ودعا الباحث ن ج الدعوة وشار على المكدس،
ونحن نمر مؤشرات لهم في الدعوة sscanf.
ويفضل وضع هذه المتغيرات في بنية تخزين العناصر على استخدام المساحة المخصصة
على كومة مع malloc، وبما انك تجنب النفقات العامة من الدعوة malloc،
وكنت لا داعي للقلق حول تسرب الذاكرة.
أحرف لا مسبوقة بعلامة النسبة المئوية لا يدفع التحويل.
بل مجرد إضافة لمواصفات الشكل.
>> على سبيل المثال، إذا كانت السلسلة في شكل GetInt كانت د٪ بدلا من ذلك،
وsscanf البحث عن هذه الرسالة في يعقبه الباحث،
وعلى الرغم من أنه سيكون محاولة لتحويل كثافة العمليات، فإنه لن تفعل أي شيء آخر مع أحد.
والاستثناء الوحيد لهذا هو بيضاء.
حرف مسافة بيضاء في سلسلة التنسيق تطابق اي مبلغ بيضاء -
لا شيء على الإطلاق.
لذلك، لهذا السبب ربما يذكر التعليق مع كبار و / أو المرتبة بيضاء.
لذلك، في هذه المرحلة سوف يبدو لنا دعوة sscanf محاولة تحليل سلسلة للمستخدم إدخال
عن طريق التحقق من الممكن بيضاء الرائدة،
تليها الباحث أنه سيتم تحويلها وتخزينها في متغير ن الباحث
تليها بعض كمية بيضاء، وتليها حرف
ج المخزنة في المتغير شار.
>> وماذا عن قيمة المقابل؟
سوف Sscanf تحليل سطر الإدخال من البداية إلى النهاية،
وقف عندما يصل إلى نهاية أو عند حرف في الإدخال
لا يطابق شكل حرف أو عندما لا يمكن إجراء تحويل.
يتم استخدام القيمة انها العودة الى واحد عند توقف.
إذا توقفت عن ذلك، لأنه وصل إلى نهاية سلسلة الإدخال
قبل اتخاذ أي تحويلات وقبل الفشل في تطابق جزء من سلسلة التنسيق،
ثم يتم إرجاع EOF خاصة ثابتة.
خلاف ذلك، فإنها ترجع عدد التحويلات الناجحة،
والتي يمكن أن تكون 0 أو 1 أو 2، منذ طلبنا لمدة التحويلات.
في حالتنا، ونحن نريد أن نتأكد من أن المستخدم بكتابتها في الباحث والباحث فقط.
>> لذلك، ونحن نريد العودة sscanf 1. ترى لماذا؟
إذا عاد sscanf 0، ثم لم تجر التحويلات،
وبالتالي فإن المستخدم كتابة شيء آخر غير عدد صحيح في بداية الإدخال.
إذا sscanf بإرجاع 2، ثم لم اكتب المستخدم بشكل صحيح في في بداية المدخل،
لكنها كتبت بعد ذلك في بعض الحرف غير بيضاء بعد ذلك
منذ نجحت ج٪ التحويل.
نجاح باهر، وهذا لا بأس به شرحا مطولا لاستدعاء دالة واحدة.
على أي حال، إذا كنت تريد المزيد من المعلومات عن sscanf والأشقاء والخمسين،
إطلاعك على صفحات الرجل، وجوجل، أو كليهما.
هناك الكثير من الخيارات سلسلة التنسيق،
ويمكن لهذه توفر لك الكثير من العمل اليدوي عند محاولة تحليل السلاسل في C.
>> وظيفة النهائي في المكتبة هو أن ننظر إلى GetString.
تبين أن GetString هي وظيفة صعبة للكتابة بشكل صحيح،
حتى وإن كانت تبدو مثل هذه المهمة، بسيطة المشترك.
لماذا هذا هو الحال؟
حسنا، دعونا نفكر في كيفية ونحن في طريقنا لتخزين السطر الذي يقوم المستخدم بكتابة فيها
منذ سلسلة هو سلسلة من حرف،
ونحن قد ترغب في تخزينه في مجموعة على المكدس،
ولكننا بحاجة إلى معرفة كم من الوقت مجموعة ستكون عندما نعلن ذلك.
وبالمثل، إذا كنا نريد لوضعها على كومة،
نحن بحاجة لتمريرها إلى malloc عدد وحدات البايت نريد أن الاحتياطي،
ولكن هذا أمر مستحيل.
ليست لدينا فكرة عن عدد أحرف المستخدم سوف اكتب في
قبل المستخدم في الواقع لا كتابتها.
>> A حل ساذج لهذه المشكلة هو فقط لحجز جزءا كبيرا من المساحة، ويقول،
كتلة من 1000 حرف لإدخال المستخدم،
على افتراض أن المستخدم لن اكتب في سلسلة طويلة.
هذا هو فكرة سيئة لسببين.
أولا، على افتراض أن المستخدمين عادة لا اكتب في سلاسل طويلة،
هل يمكن أن تضيع الكثير من الذاكرة.
على الأجهزة الحديثة، وهذا قد لا يكون مشكلة إذا قمت بذلك
في واحد أو اثنين حالات معزولة،
ولكن إذا كنت تتناولين إدخال المستخدم في حلقة وتخزين لاستخدامها لاحقا،
يمكنك تمتص بسرعة من نصف طن من الذاكرة.
بالإضافة إلى ذلك، إذا كان البرنامج كنت تكتب هي لأصغر كمبيوتر -
جهاز الهاتف الذكي مثل أو أي شيء آخر مع ذاكرة محدودة -
هذا الحل سوف يسبب مشاكل على نحو أسرع كثيرا.
الثانية، والسبب الأكثر خطورة لعدم القيام بذلك هو أنه يترك البرنامج الخاص بك عرضة
لما يسمى هجوم تجاوز سعة المخزن المؤقت.
في البرمجة، وهو المخزن المؤقت الذاكرة المستخدمة لتخزين مؤقتا الإدخال أو الإخراج البيانات،
وهو في هذه الحالة هو لدينا 1000-شار كتلة.
A تجاوز سعة المخزن المؤقت يحدث عندما تتم كتابة البيانات بعد نهاية الكتلة.
>> على سبيل المثال، إذا قام مستخدم في الواقع لا في نوع أكثر من 1000 حرف.
قد شهدت لك هذا الخطأ أثناء البرمجة مع المصفوفات.
إذا كان لديك مجموعة من 10 رجات، لا شيء يمنعك من محاولة القراءة أو الكتابة
كثافة العمليات 15.
لا توجد تحذيرات أو أخطاء مترجم.
برنامج اخطاء فقط إلى الأمام مباشرة ويصل إلى ذاكرة
حيث يعتقد الباحث سوف يكون 15، وهذا يمكن أن الكتابة المتغيرات الأخرى الخاصة بك.
في أسوأ الحالات، يمكنك الكتابة فوق بعض الداخلي البرنامج الخاص بك
آليات الرقابة، مما تسبب في البرنامج الخاص لتنفيذ تعليمات فعلا مختلفة
من يقصد لك.
>> الآن، انها ليست مشتركة للقيام بذلك بطريق الخطأ،
ولكن هذا هو أسلوب شائع إلى حد كبير أن الأشرار استخدام برامج لكسر
ووضع تعليمات برمجية ضارة على أجهزة الكمبيوتر الآخرين.
ولذلك، فإننا لا نستطيع مجرد استخدام لدينا حل ساذج.
نحن بحاجة إلى وسيلة لمنع برامجنا من أن تكون عرضة
إلى المخزن مؤقت هجوم تجاوز.
للقيام بذلك، نحن بحاجة للتأكد من أن المخزن المؤقت لدينا يمكن أن تنمو كما قرأنا
المزيد من المدخلات من المستخدم.
الحل؟ نستخدم العازلة المخصصة الكومة.
لأننا يمكن تغيير حجمها باستخدام تغيير الحجم وظيفة realloc،
ونحن تتبع رقمين - مؤشر فتحة فارغة المقبل في المخزن المؤقت
وطول أو قدرة المخزن المؤقت.
نقرأ في حرف من مستخدم واحد في وقت واحد باستخدام وظيفة fgetc.
حجة وظيفة fgetc يأخذ - ستدين - هو إشارة إلى سلسلة الإدخال القياسية،
وهو قناة الإدخال preconnected التي تستخدم لنقل إدخال المستخدم
من محطة إلى البرنامج.
>> عندما يقوم المستخدم أنواع في شخصية جديدة، ونحن تحقق لمعرفة ما إذا كان مؤشر
من فتحة الحرة المقبل زائد 1 هو أكبر من قدرة المخزن المؤقت.
و+1 يأتي في أنه إذا كان مؤشر المقبل الحرة 5،
ثم يجب طول المخزن المؤقت يكون لدينا 6 شكرا إلى 0 الفهرسة.
إذا كنا قد نفدت مساحة في المخزن المؤقت، ثم نحاول تغيير حجمه،
مضاعفة ذلك حتى يتسنى لنا خفض عدد المرات التي نقوم بتغيير حجم
إذا كان المستخدم هو كتابة في سلسلة طويلة حقا.
إذا كانت السلسلة قد حصلت طويلة جدا أو إذا كنا نفاد الذاكرة الكومة،
نحن لدينا وتحرير عازلة خالية العودة.
>> وأخيرا، فإننا إلحاق شار إلى المخزن المؤقت.
وبمجرد أن يضرب المستخدم إدخال أو العودة، مما يشير إلى سطر جديد،
أو الاستثنائية شار - التحكم د - مما يشير إلى نهاية الإدخال،
نحن نفعل تحقق لمعرفة ما إذا كان المستخدم كتابتها في الواقع أي شيء على الإطلاق.
إن لم يكن، نعود فارغة.
خلاف ذلك، وذلك لأن لدينا العازلة قد يكون أكبر مما نحتاج،
في أسوأ الحالات انها تقريبا ضعفي نحن بحاجة
لأننا في كل مرة كنا مضاعفة حجم،
نحن جعل نسخة جديدة من السلسلة فقط باستخدام مقدار المساحة التي نحتاجها.
نضيف بين 1 اضافية لدعوة malloc،
ذلك أن هناك مساحة للطابع خاص فاصل فارغة - و\ 0،
ونحن إلحاق إلى السلسلة مرة واحدة ونحن نسخ في بقية الأحرف،
باستخدام strncpy بدلا من strcpy
بحيث لا يمكننا تحديد بالضبط عدد أحرف نريد نسخها.
نسخ Strcpy حتى يضرب \ 0.
ثم نحرر عازلة لدينا نسخة والعودة إلى الطالب.
>> يعرف الذين يمكن هذه الوظيفة بسيطة ما يبدو معقدة جدا؟
الآن أنت تعرف ما يدور في المكتبة CS50.
>> اسمي نيت Hardison، وهذا هو CS50.
[CS50.TV]