1 00:00:00,000 --> 00:00:02,490 [Powered by Google Translate] [CS50 লাইব্রেরী] 2 00:00:02,490 --> 00:00:04,220 [Nate 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 >> সি লাইব্রেরি ভিডিও, আমরা কিভাবে # আপনি হেডার ফাইল অন্তর্ভুক্ত সম্পর্কে কথা বলা 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 float, সীমা, মান bool, এবং মান lib. 23 00:01:25,670 --> 00:01:28,800 আবার, reinventing চাকা না নীতিকে অনুসরণ, 24 00:01:28,800 --> 00:01:33,490 আমরা CS0 গ্রন্থাগারের টুল যা আমাদের জন্য উপলব্ধ অন্যান্য ব্যবহার করে তৈরি করেছি. 25 00:01:33,490 --> 00:01:38,690 >> পরের জিনিস আপনি লাইব্রেরি দেখতে পাবেন যে আমরা একটি নতুন ধরনের নামক define "স্ট্রিং." 26 00:01:38,690 --> 00:01:42,330 এই লাইন সত্যিই ঠিক গৃহস্থালি * টাইপ জন্য একটি alias সৃষ্টি, 27 00:01:42,330 --> 00:01:46,000 তাই এটি magically নতুন বৈশিষ্ট্যাবলী সঙ্গে স্ট্রিং টাইপ না পান করান না 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 আমরা ঘুরে ডিক্লেয়ার,, ব্যবহারকারী এবং ফিরতি অক্ষর, টেনিস, floats, ints প্রম্পট কাজ, 37 00:02:19,150 --> 00:02:24,160 দীর্ঘ longs, এবং স্ট্রিং, আমাদের নিজস্ব স্ট্রিং ব্যবহার করে টাইপ. 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 এটি থেকে জানতে, এবং বিভিন্ন মেশিনে এটি যদি আপনি চান recompile, 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 এটি একটি গৃহস্থালি, একটা ডাবল, একটা float, ইত্যাদি হতে 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 কল যে ব্যবহারকারীর ইনপুট parses. 57 00:03:34,720 --> 00:03:38,160 Sscanf হয় ইনপুট ফরম্যাটে রূপান্তর পরিবারের অংশ. 58 00:03:38,160 --> 00:03:42,300 এটা মান io.h মধ্যে বসবাস করেন, এবং তার পেশা একটি সি পংক্তি সঠিকরূপে মীমাংসা করা হয়, 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 যে অক্ষর সি স্ট্রিং প্রথম অক্ষরটি করা উচিত, 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 একটি ফরম্যাট স্ট্রিং শতাংশ সাইন একটি রূপান্তর specifier ইঙ্গিত দেয়. 73 00:04:28,650 --> 00:04:30,850 অক্ষর অবিলম্বে একটি শতাংশ সাইন অনুসরণ, 74 00:04:30,850 --> 00:04:35,430 ইঙ্গিত সি টাইপ করতে চান যে আমরা রূপান্তর যাও sscanf. 75 00:04:35,430 --> 00:04:40,090 GetInt ইন, আপনি দেখতে যে একটি% d% এবং একটি সি আছে. 76 00:04:40,090 --> 00:04:48,690 এর মানে হল এই যে একটি sscanf দশমিক int-এ চেষ্টা হবে -% d - এবং একটি গৃহস্থালি -% গ. 77 00:04:48,690 --> 00:04:51,510 প্রতিটি পংক্তিতে বিন্যাসে রূপান্তর specifier, 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 ampersand - - যাও পয়েন্টার পাস এবং তারপর ঠিকানা অপারেটর ব্যবহার 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 বলা হবে এবং একটি গৃহস্থালি স্ট্যাক কল গ ঘোষণা, 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 একটি চিঠি কোন int অনুসরণ জন্য দেখাবে, 95 00:05:59,800 --> 00:06:04,360 এবং যখন এটা int-এ রূপান্তর করার চেষ্টা করবে, এটি একটি সঙ্গে অন্য কিছু না করে. 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 এমনকি none 'এ সব. 99 00:06:12,890 --> 00:06:18,100 সুতরাং, যে কেন মন্তব্য নেই নেতৃস্থানীয় এবং / অথবা হোয়াইটস্পেস trailing সঙ্গে সম্ভবত উল্লেখ করা হয় না. 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-এ যে রূপান্তরিত int-পরিবর্তনশীল n করা হবে এবং সংরক্ষিত অনুসরণ 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 তারপর বিশেষ ধ্রুবক ফাইলের শেষে ফিরিয়ে দেওয়া হয়. 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 গ রূপান্তর% থেকে অনুসৃত. 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 man পৃষ্ঠা, গুগুল, অথবা উভয় চেক আউট. 125 00:07:57,130 --> 00:07:58,780 ফরম্যাট স্ট্রিং বিকল্প অনেক আছে, 126 00:07:58,780 --> 00:08:03,830 এবং এই কায়িক শ্রম অনেক সংরক্ষণের সময় সি মধ্যে পংক্তি সঠিকরূপে মীমাংসা করার চেষ্টা করতে পারেন 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 ints একটি শ্রেণীবিন্যাস আছে, যাও বা পড়তে ও লিখতে চেষ্টা থেকে কিছুই আপনি স্টপ 161 00:10:05,620 --> 00:10:07,810 15 int. 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-15th, এবং আপনার এই অন্যান্য ভেরিয়েবল মুছে ফেলা যাবে না. 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 ফাংশন লাগে - 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 যদি না হয়, আমরা ফিরে নাল. 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 আমরা malloc কলে একটি অতিরিক্ত 1 যোগ করুন, 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 এর পরিবর্তে strcpy strncpy ব্যবহার 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 >> আমার নাম Nate Hardison, এবং এই CS50. 212 00:13:06,470 --> 00:13:08,350 [CS50.TV]