[Powered by Google Translate] [CS50 লাইব্রেরী] [Nate Hardison] [হার্ভার্ড বিশ্ববিদ্যালয়] [এটি CS50. CS50.TV] CS50 লাইব্রেরি একটি সহায়ক হাতিয়ার যে আমরা প্রয়োগ ইনস্টল করা আছে এটা সহজ করার জন্য আপনাকে প্রোগ্রাম লেখার জন্য যে ইনপুট জন্য প্রম্পট ব্যবহারকারীদের. এই ভিডিওতে, আমরা পরদা পিছিয়ে আসা এবং CS50 লাইব্রেরি কি ঠিক হল তাকান করব. সি লাইব্রেরি ভিডিও, আমরা কিভাবে # আপনি হেডার ফাইল অন্তর্ভুক্ত সম্পর্কে কথা বলা আপনার সোর্স কোড লাইব্রেরী, এবং তারপর একটি বাইনারি লাইব্রেরি ফাইলের সাথে লিঙ্ক সময়ে লিঙ্ক এর কম্পাইলেশন প্রক্রিয়া. হেডার ফাইল গ্রন্থাগারের ইন্টারফেস নির্দিষ্ট করুন. যে, তারা সমস্ত সম্পদের যে লাইব্রেরি উপলব্ধ করার জন্য আপনাকে ব্যবহার করার জন্য বিশদ, ভালো ফাংশন ঘোষণা, ধ্রুবক, এবং তথ্য ধরনের. গ্রন্থাগারের বাইনারি ফাইল গ্রন্থাগারের বাস্তবায়ন রয়েছে, যা গ্রন্থাগারের এর হেডার ফাইল এবং এর লাইব্রেরি. গ সোর্স কোড থেকে ফাইল কম্পাইল করা হয়. গ্রন্থাগারের বাইনারি ফাইল খুব এ থেকে এটা, ভাল বাইনারি মধ্যে, তার আকর্ষণীয় নয়. সুতরাং, আসুন গ্রন্থাগারের জন্য হেডার ফাইল পরিবর্তে কটাক্ষপাত করা. এই ক্ষেত্রে শুধুমাত্র একটি হেডার ফাইলটি নামক cs50.h. আছে আমরা ব্যবহার করেছি এটি ইনস্টল ডিরেক্টরি অন্তর্ভুক্ত করার নির্দেশ হেডার ফাইল সহ অন্যান্য সিস্টেমের লাইব্রেরি '. প্রথম জিনিষ আপনি বিজ্ঞপ্তি পাবেন হল যে # cs50.h অন্যান্য লাইব্রেরি থেকে হেডার ফাইল অন্তর্ভুক্ত করা - float, সীমা, মান bool, এবং মান lib. আবার, reinventing চাকা না নীতিকে অনুসরণ, আমরা CS0 গ্রন্থাগারের টুল যা আমাদের জন্য উপলব্ধ অন্যান্য ব্যবহার করে তৈরি করেছি. পরের জিনিস আপনি লাইব্রেরি দেখতে পাবেন যে আমরা একটি নতুন ধরনের নামক define "স্ট্রিং." এই লাইন সত্যিই ঠিক গৃহস্থালি * টাইপ জন্য একটি alias সৃষ্টি, তাই এটি magically নতুন বৈশিষ্ট্যাবলী সঙ্গে স্ট্রিং টাইপ না পান করান না অন্যান্য ভাষায় স্ট্রিং বস্তুর সঙ্গে যুক্ত, যেমন দৈর্ঘ্য. কারণ আমরা এই করেছেন যাও রক্তাক্ত বিবরণ থেকে নতুন প্রোগ্রামারদের রক্ষা হয় পয়েন্টার পর্যন্ত তারা প্রস্তুত. হেডার ফাইলটি পরবর্তী অংশ হল ফাংশন ঘোষণা যে CS50 গ্রন্থাগারের সঙ্গে ডকুমেন্টেশন বরাবর প্রদান করে. বিস্তারিত এখানে মন্তব্য স্তর লক্ষ্য করুন. এটি সুপার গুরুত্বপূর্ণ যাতে মানুষ এখন জানে কিভাবে এই ফাংশান ব্যবহার. আমরা ঘুরে ডিক্লেয়ার,, ব্যবহারকারী এবং ফিরতি অক্ষর, টেনিস, floats, ints প্রম্পট কাজ, দীর্ঘ longs, এবং স্ট্রিং, আমাদের নিজস্ব স্ট্রিং ব্যবহার করে টাইপ. নিম্নলিখিত তথ্য লোকানোর নীতিকে, . আমরা একটি পৃথক গ বাস্তবায়ন ফাইল আছে আমাদের সংজ্ঞা করা - cs50.c-- ব্যবহারকারী উৎস ডিরেক্টরির মধ্যে অবস্থিত. আমরা যে ফাইল সরবরাহ করেছি, যাতে আপনি এটি কটাক্ষপাত করা যেতে পারে, এটি থেকে জানতে, এবং বিভিন্ন মেশিনে এটি যদি আপনি চান recompile, যদিও আমরা মনে করি এই ভাল বর্গ জন্য যন্ত্র কাজ. যাই হোক, এখন আমি কি এটা কটাক্ষপাত করা. ফাংশন GetChar, GetDouble, GetFloat, GetInt, এবং GetLongLong সকল GetString ফাংশন উপর নির্মিত. এটি সক্রিয় যে তারা সব একই প্যাটার্ন অনুসরণ মূলত. তারা ইনপুট একটি লাইন জন্য ব্যবহারকারীকে অনুরোধ জানানো যখন একটি লুপ ব্যবহার. তারা কোন ব্যবহারকারী একটি খালি লাইন ইনপুট যদি বিশেষ মূল্য ফেরত. তারা উপযুক্ত টাইপ হিসাবে ব্যবহারকারীর ইনপুট পার্স করার প্রচেষ্টা, এটি একটি গৃহস্থালি, একটা ডাবল, একটা float, ইত্যাদি হতে এবং তারপরে তারা হয় ফলে ইনপুট যদি সফলভাবে পার্স ছিল প্রত্যাবর্তন অথবা তারা ব্যবহারকারী reprompt. একটি উচ্চ পর্যায়ের এখানে আছে কিছুই সত্যিই চতুর. আপনি লিখিত অতীতে পারে নিজেকে একভাবে কাঠামোবদ্ধ কোড. সম্ভবত সবচেয়ে রহস্যময় সুদর্শন ভাগে sscanf কল যে ব্যবহারকারীর ইনপুট parses. Sscanf হয় ইনপুট ফরম্যাটে রূপান্তর পরিবারের অংশ. এটা মান io.h মধ্যে বসবাস করেন, এবং তার পেশা একটি সি পংক্তি সঠিকরূপে মীমাংসা করা হয়, অনুযায়ী একটি বিশেষ বিন্যাসে, পরিবর্তনশীল মধ্যে পার্স ফলাফল সংরক্ষণ আহ্বানকারী দ্বারা উপলব্ধ. যেহেতু ইনপুট ফরম্যাটে রূপান্তর ফাংশন খুব দরকারী, বহুল ব্যবহৃত ফাংশন যে সুপার স্বজ্ঞাত প্রথম নয়, আমরা কিভাবে sscanf উপর কাজ করে যাবেন. sscanf যাও প্রথম যুক্তি হল একটি গৃহস্থালি * - একটি অক্ষর একটি পয়েন্টার. জন্য সঠিকভাবে ফাংশন কাজ, যে অক্ষর সি স্ট্রিং প্রথম অক্ষরটি করা উচিত, নাল \ 0 অক্ষর দিয়ে সমাপ্ত. এই পংক্তি সঠিকরূপে মীমাংসা করা sscanf যাও দ্বিতীয় যুক্তি হল বিন্যাসে একটি পংক্তি, হিসাবে একটি স্ট্রিং ধ্রুবক সাধারণত পাশ, এবং আপনি যখন একটি ভালো printf ব্যবহার করার আগে স্ট্রিং দেখা হতে পারে. একটি ফরম্যাট স্ট্রিং শতাংশ সাইন একটি রূপান্তর specifier ইঙ্গিত দেয়. অক্ষর অবিলম্বে একটি শতাংশ সাইন অনুসরণ, ইঙ্গিত সি টাইপ করতে চান যে আমরা রূপান্তর যাও sscanf. GetInt ইন, আপনি দেখতে যে একটি% d% এবং একটি সি আছে. এর মানে হল এই যে একটি sscanf দশমিক int-এ চেষ্টা হবে -% d - এবং একটি গৃহস্থালি -% গ. প্রতিটি পংক্তিতে বিন্যাসে রূপান্তর specifier, sscanf যুক্তি তালিকায় প্রত্যাবর্তনের একটি যথাযত যুক্তি পরে. যে যুক্তি একটি সুসংগত টাইপ অবস্থান নির্দেশ করতে হবে যা রূপান্তর ফলাফল স্টোর. এই করছেন আদর্শ উপায় স্ট্যাকের উপর একটি পরিবর্তনশীল তৈরি sscanf কল আগে প্রতিটি আইটেমের জন্য যে পংক্তিটি থেকে পার্স করতে চান ampersand - - যাও পয়েন্টার পাস এবং তারপর ঠিকানা অপারেটর ব্যবহার যাও sscanf কল যারা ভেরিয়েবল. আপনি যে আমরা GetInt কি ঠিক এই দেখতে পারেন. রাইট sscanf কল করার আগে, আমরা কোন int বলা হবে এবং একটি গৃহস্থালি স্ট্যাক কল গ ঘোষণা, এবং আমরা sscanf কল মধ্যে পয়েন্টার তাদের পাস. স্ট্যাক এই ভেরিয়েবলগুলি নির্বাণ জন্য বরাদ্দ করা স্থান ব্যবহার বেশী প্রাধান্য না উপর malloc সঙ্গে গাদা, যেহেতু আপনি malloc কল ওভারহেড এড়াতে, এবং আপনি মেমরি লিক সম্বন্ধে চিন্তা করতে হবে না. অগ্রে যুক্ত একটি শতাংশ সাইন দ্বারা হইনি অক্ষর রূপান্তর না করার অনুরোধ জানাতে না. বরং তারা শুধুমাত্র বিন্যাসে স্পেসিফিকেশন যোগ করুন. উদাহরণস্বরূপ, যদি GetInt বিন্যাসে ছিল পরিবর্তে একটি পংক্তি% d, sscanf একটি চিঠি কোন int অনুসরণ জন্য দেখাবে, এবং যখন এটা int-এ রূপান্তর করার চেষ্টা করবে, এটি একটি সঙ্গে অন্য কিছু না করে. এই একমাত্র ব্যতিক্রম হলো হোয়াইটস্পেস. হোয়াইট বিন্যাসে স্ট্রিং স্থান অক্ষর হোয়াইটস্পেস কোনো পরিমাণ মেলে - এমনকি none 'এ সব. সুতরাং, যে কেন মন্তব্য নেই নেতৃস্থানীয় এবং / অথবা হোয়াইটস্পেস trailing সঙ্গে সম্ভবত উল্লেখ করা হয় না. এই বিন্দু এটি আমাদের sscanf কলের মত দেখতেও সুতরাং, ব্যবহারকারীর ইনপুট পংক্তি সঠিকরূপে মীমাংসা করা চেষ্টা করা দ্বারা সম্ভব নেতৃস্থানীয় হোয়াইটস্পেস পরীক্ষণের জন্য, একটি int-এ যে রূপান্তরিত int-পরিবর্তনশীল n করা হবে এবং সংরক্ষিত অনুসরণ অনুসরণ হোয়াইটস্পেস কিছু পরিমাণ দ্বারা, এবং একটি অক্ষর দ্বারা অনুসরণ গৃহস্থালির কাজ পরিবর্তনশীল গ সঞ্চিত. ফিরতি মূল্য সম্পর্কে কি? Sscanf থেকে শুরু ইনপুট লাইনের শেষ পার্স করতে হবে, স্তম্ভন যখন এটি শেষ পৌছানোর বা ইনপুট মধ্যে একটি চরিত্র যখন মেলে না অথবা একটি অক্ষর বিন্যাস না যখন এটি একটি রূপান্তর করতে পারবেন না. এটা এর ফিরতি মূল্য যখন এটি বন্ধ একক ব্যবহার করা হয়. যদি এটি বন্ধ, কারণ এটা ইনপুট স্ট্রিং শেষ পৌঁছেছেন আগে কোনো ধর্মান্তর এবং তৈরীর আগে বিন্যাসে স্ট্রিং অংশ মেলে ব্যর্থ, তারপর বিশেষ ধ্রুবক ফাইলের শেষে ফিরিয়ে দেওয়া হয়. অন্যথা, এটি সফল রূপান্তর নম্বর ফেরৎ, যা 0, 1, বা 2 হবে, যেহেতু আমরা দুই রূপান্তরের জন্য জিজ্ঞাসা করেছি পারে. আমাদের ক্ষেত্রে, আমরা নিশ্চিত যে ব্যবহারকারীর কোন int এবং শুধুমাত্র কোন int টাইপ করতে চান. সুতরাং, আমরা sscanf 1 ফিরে চান. দেখুন কেন? যদি sscanf ফিরে 0 তারপর, কোন রূপান্তর করা হয় নি, তাই কিছু ব্যবহারকারী ইনপুট শুরুতে কোন int ছাড়া অন্য টাইপ. যদি sscanf ফেরৎ 2 পরে, ব্যবহারকারী সঠিকভাবে এটা টাইপ ইনপুট প্রারম্ভে মধ্যে, কিন্তু তারপর তারা কিছু অ হোয়াইটস্পেস অক্ষর টাইপ পশ্চাৎ গ রূপান্তর% থেকে অনুসৃত. বাহ, বেশ যে এর একটি ফাংশন কল জন্য সুদীর্ঘ ব্যাখ্যা. যাইহোক, যদি আপনি sscanf এবং তার ভাইবোন সম্পর্কে আরও তথ্য চান, man পৃষ্ঠা, গুগুল, অথবা উভয় চেক আউট. ফরম্যাট স্ট্রিং বিকল্প অনেক আছে, এবং এই কায়িক শ্রম অনেক সংরক্ষণের সময় সি মধ্যে পংক্তি সঠিকরূপে মীমাংসা করার চেষ্টা করতে পারেন গ্রন্থাগারের অন্তিম ফাংশন তাকান হয় GetString. এটি সক্রিয় যে GetString একটি চতুর ফাংশন সঠিকভাবে লিখুন, যদিও এটি যেমন একটি সহজ, সাধারণ টাস্ক ভালো মনে হচ্ছে. কেন এই ক্ষেত্রে? ভাল, যাক কিভাবে আমরা লাইন সঞ্চয় চলুন সম্পর্কে মনে করেন যে ব্যবহারকারী ধরনের ইন যেহেতু একটি অক্ষর স্ট্রিংটি একটি অনুক্রম, আমরা একটি অ্যারের মধ্যে স্ট্যাক এটি সঞ্চয় করতে পারেন, কিন্তু আমরা কতক্ষণ অ্যারের হবে, আমরা যখন এটা ডিক্লেয়ার করা হয় জানতে হবে. একই ভাবে, যদি আমরা হিপ লাগাতে চান, আমরা malloc যাও বাইট সংখ্যা আমরা সংচিতি করতে চান পাস প্রয়োজন, কিন্তু এই অসম্ভব. আমরা কোন ধারণা কতগুলি ব্যবহারকারী অক্ষর টাইপ করা আছে আগে আসলে ব্যবহারকারী তাদের জন্য টাইপ করুন. এই সমস্যার সমাধান অখল শুধু একটি স্থান বড় খণ্ড, রিজার্ভ বলতে হয় ব্যবহারকারী ইনপুট এর জন্য 1000 অক্ষর একটি ব্লক, অভিমানী যে ব্যবহারকারী একটি স্ট্রিং টাইপ না যে দীর্ঘ. এটি একটি দুটি কারণে খারাপ ধারণা. প্রথমত, গ্রহ যে সাধারণত ব্যবহারকারীরা স্ট্রিং মধ্যে যে দীর্ঘ না টাইপ, আপনি মেমরি অনেক অপব্যয় পারে. আধুনিক মেশিনে, এই একটি সমস্যা যদি আপনি এই কাজ করতে না পারে একটি বা দুটি ভিন্ন দৃষ্টান্ত, কিন্তু আপনি যদি একটি লুপ এর ব্যবহারকারী ইনপুট গ্রহণ করছেন এবং পরে ব্যবহার করার জন্য সংরক্ষণ, আপনি দ্রুত স্তন্যপান মেমরি টন আপ করতে পারেন. উপরন্তু, যদি প্রোগ্রাম আপনাকে একটি ছোট কম্পিউটার লেখার জন্য - একটি সীমিত মেমরি স্মার্টফোনের বা অন্য কিছু ভালো একটি ডিভাইস - এই সমাধান সমস্যার সৃষ্টি অনেক দ্রুততর হবে. দ্বিতীয়, আরো গুরুতর কারণ এই না যে এটা আপনার প্রোগ্রাম পাতার প্রবন কি একটা বাফার ওভারফ্লো আক্রমণ বলা হয়. প্রোগ্রামিং, একটি বাফার মেমরি অস্থায়ীভাবে ইনপুট অথবা আউটপুট তথ্য সংরক্ষণ, যা এই ক্ষেত্রে আমাদের 1000 দহন ব্লক. একটি বাফার ওভারফ্লো ঘটে যখন তথ্য ব্লক শেষে গত করা হয়. উদাহরণস্বরূপ, যদি সত্যিই কোন ব্যবহারকারী অধিক 1000 অক্ষর টাইপ আছে. আপনি দূর্ঘটনাক্রমে এই অভিজ্ঞতা হতে পারে অ্যারে সঙ্গে যখন প্রোগ্রামিং. আপনি যদি 10 ints একটি শ্রেণীবিন্যাস আছে, যাও বা পড়তে ও লিখতে চেষ্টা থেকে কিছুই আপনি স্টপ 15 int. কোন কম্পাইলার সতর্কবার্তা বা ত্রুটি আছে. প্রোগ্রাম ঠিক সাঙ্ঘাতিক ভুল সরাসরি এগিয়ে মেমরি ব্যবহারের যেখানে এটি মনে int-15th, এবং আপনার এই অন্যান্য ভেরিয়েবল মুছে ফেলা যাবে না. সবচেয়ে খারাপ ক্ষেত্রে, আপনি আপনার প্রোগ্রাম এর অভ্যন্তরীণ কিছু মুছে ফেলা হতে পারে নিয়ন্ত্রণ প্রক্রিয়া, আসলে আপনার প্রোগ্রাম যার ফলে বিভিন্ন নির্দেশাবলী চালানো এর চেয়ে বেশী নয়. এখন, এটা ঘটনাক্রমে এই সাধারণ করবেন না, কিন্তু এই একটি মোটামুটি সাধারণ পদ্ধতি যে খারাপ না প্রোগ্রাম ব্যবহার বিরতি এবং অন্য লোকেদের কম্পিউটারে অনিষ্টকারী কোড করা. অতএব, আমরা আমাদের সাদাসিধে সমাধান ব্যবহার করতে পারবেন না. আমরা হচ্ছে প্রবন থেকে আমাদের প্রোগ্রাম প্রতিরোধ করার উপায় প্রয়োজন একটি বাফার ওভারফ্লো আক্রমণ. এই কাজের জন্য, আমরা নিশ্চিত যে আমাদের বাফার হিসাবে আমরা পড়েছি হত্তয়া করতে প্রয়োজন ব্যবহারকারী থেকে ইনপুট আরো. সমাধান? আমরা এক গাদা বাফার বরাদ্দ ব্যবহার. যেহেতু আমরা মাপ পরিবর্তন করতে ব্যবহার realloc ফাংশন পুনরায় মাপ, এবং আমরা দুটি সংখ্যার ট্র্যাক রাখা - বাফারে পরের স্লট খালি সূচী এবং দৈর্ঘ্য বা বাফার ক্ষমতা. ব্যবহারকারী থেকে এক অক্ষরের মধ্যে আমরা এমন একটি সময় fgetc ফাংশন ব্যবহার করে পড়া. যুক্তি fgetc ফাংশন লাগে - stdin - প্রমিত ইনপুট পংক্তিটি একটি রেফারেন্স, যা preconnected ইনপুট চ্যানেল ব্যবহারকারীর ইনপুট হস্তান্তর ব্যবহৃত হয় থেকে টার্মিনাল প্রোগ্রাম. ব্যবহারকারী যখনই একটি নতুন চরিত্রের ধরন, আমরা কিনা পরীক্ষা সূচক পরবর্তী বিনামূল্যে স্লট প্লাস 1 বাফার ক্ষমতার চেয়ে বেশী. +1 টি কারণ যদি পরের বিনামূল্যে সূচক 5 মধ্যে আসে, তারপর আমাদের বাফার এর দ্বারা 6 ধন্যবাদ 0 ইন্ডেক্স করা আবশ্যক. যদি আমরা স্থান রান করেছি বাফারে আউট করে, আমরা একে মাপ পরিবর্তন করার প্রচেষ্টা, এটি দ্বিত্ব যাতে আমরা বার সংখ্যার উপর কাটা নিচে যে আমরা মাপ পরিবর্তন যদি ব্যবহারকারী একটি সত্যিই দীর্ঘ স্ট্রিং টাইপ করতে হয়. যদি স্ট্রিং অত্যন্ত দীর্ঘ অর্জিত অথবা যদি আমরা গাদা মেমরি রান আউট করেনি, আমরা আমাদের বাফার এবং ফিরতি নাল মুক্ত. পরিশেষে, আমরা বাফার গৃহস্থালির কাজ লিখবেন. একবার ব্যবহারকারী হিট অথবা প্রবেশ প্রত্যাবর্তন, একটি নতুন লাইন সংকেতের, বা বিশেষ গৃহস্থালি - নিয়ন্ত্রণ ঘ - যা ইনপুট শেষ ইঙ্গিত, আমরা যদি ব্যবহারকারী আসলে কিছু টাইপ করা এ সমস্ত দেখুন একটা চেক করবেন. যদি না হয়, আমরা ফিরে নাল. অন্যথা, কারণ আমাদের বাফার সম্ভবত বৃহত্তর আমরা প্রয়োজন, এটি লক আছে প্রায় হিসাবে দুইবার বড় হিসাবে আমরা প্রয়োজন যেহেতু আমরা প্রতিটি সময় আমরা মাপ পরিবর্তন, দুবার আমরা একটি স্ট্রিং ঠিক পরিমাণ স্থান ব্যবহার করে যে আমরা প্রয়োজন একটি নতুন অনুলিপি করা. আমরা malloc কলে একটি অতিরিক্ত 1 যোগ করুন, \ 0, - যাতে বিশেষ অক্ষর নাল টারমিনেটর জন্য স্থান আছে যা আমরা স্ট্রিং লিখবেন একবার আমরা অক্ষর বাকি কপি, এর পরিবর্তে strcpy strncpy ব্যবহার যাতে আমরা ঠিক কতগুলি অক্ষর আমরা কপি করতে চান নির্দিষ্ট করতে পারেন. Strcpy কপি করা পর্যন্ত এটি একটি \ 0 হিট. তারপর আমরা আমাদের বাফার এবং মুক্ত কলার কপি ফেরত. যেমন একটি সহজ-আপাতভাবে বিদ্যমান ফাংশন যাতে জটিল হতে পারে কে জানত? এখন আপনি কি জানেন CS50 গ্রন্থাগারের মধ্যে কি করা যায়. আমার নাম Nate Hardison, এবং এই CS50. [CS50.TV]