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، ما در مورد چگونگی # شامل فایل های header 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 است که از فایل های هدر کتابخانه و کتابخانه C فایل های کد منبع وارد شده است. 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 شناور، محدودیت، استاندارد بولی، و معاونت استاندارد. 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 این خط واقعا فقط ایجاد یک نام مستعار برای نوع char *، 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 ما اعلام می کنیم، به نوبه خود، توابع به بی درنگ کاراکتر کاربر و بازگشت، دو برابر، شناور، نوع داده int، 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 در حال حاضر تعریف ما را در یک فایل جداگانه پیاده سازی C قرار داده است - 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، شما می بینید که٪ D و C٪ وجود دارد. 76 00:04:40,090 --> 00:04:48,690 این به این معنی که sscanf به بین المللی اعشاری را امتحان کنید - درصد د - و کاراکتر -٪ C است. 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، از نوع int به نام N و C تماس کاراکتر در پشته ما اعلام می کنیم، 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 D٪ به جای آن، 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 به دنبال بین المللی است که خواهد شد و در متغیر از نوع int N تبدیل شده و ذخیره می شود 103 00:06:29,300 --> 00:06:33,090 به دنبال آن مقداری از فضای خالی، و به دنبال یک شخصیت 104 00:06:33,090 --> 00:06:35,810 ذخیره شده در C کاراکتر متغیر است. 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 در مورد ما، ما می خواهیم اطمینان حاصل کنید که کاربر در یک int است و تنها یک int تایپ. 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 به طوری که کاربر تایپ، چیزی به غیر از یک int در ابتدای ورودی است. 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 از آنجا که٪ C تبدیل موفق. 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 >> یک راه حل ساده و بی تکلف برای این مشکل این است که فقط به رزرو یک تکه بزرگ از فضا، می گویند، 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 سرریز بافر رخ می دهد که داده های گذشته است در پایان از بلوک نوشته شده است. 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 نوع داده int، هیچ چیز شما را از تلاش برای خواندن و یا نوشتن 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 که در آن فکر می کند که از INT 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 از آنجا که ما می توانیم تغییر اندازه آن را با استفاده از تغییر اندازه تابع بازتخصیص، 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 طول می کشد - STDIN - مرجع به رشته ورودی استاندارد است. 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 اگر نه، ما بازگشتی NULL است. 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]