>> বক্তা 1: এর একটি প্রোগ্রাম লিখুন যাক যে বিনা ব্যবহারকারী থেকে একটি পংক্তি পায়
CS50 লাইব্রেরি এর ব্যবহার GetString ফাংশন.
এটি করার জন্য, আমরা এগিয়ে যান এবং ব্যবহার করব scanf, ফাংশন যে GetString
ফাংশন আসলে ব্যবহার ফণা নীচে.
কিন্তু আমি ইচ্ছাকৃতভাবে এই কাজ করতে যাচ্ছি একটি বগী ভাবে.
আমি মনে করি একটি উপায় যে করতে যাচ্ছি সঠিক হতে, কিন্তু এটি দেখা যাচ্ছে যে
আমার ভাবনাটি যাচ্ছে বেশ, বেশ দ্বিধান্বিত হবেন.
এবং সত্য, বেশ বিপজ্জনক.
কারণ আমি প্রায় করছি মত বাগ প্রতিপক্ষ দ্বারা শোষিত করা যাবে না
যেমন যে আপনার মেশিনে বা আপনার প্রোগ্রাম সম্ভাব্য ভার গ্রহণ করা যেতে পারে.
>> নিম্নরূপ এর শুরু করা যাক.
প্রথমত এর আমাদের স্ট্রিং ঘোষণা করা যাক, অন্যথায়, একটি গৃহস্থালি তারকা হিসাবে এখন পরিচিত
এবং এটি গুলি কল.
পরবর্তী একটি স্ট্রিং জন্য ব্যবহারকারীকে অনুরোধ জানানো দেয়, "অনুগ্রহ করে স্ট্রিং." হিসাবে এবং
এর এখন ব্যবহারকারী থেকে স্ট্রিং পেতে দেওয়া উদ্ধতি মূল্যউদ্ধৃতি, "% s.", scanf ব্যবহার মধ্যে
অন্য কথায়, এর যে আমরা scanf অবহিত যাক আসলে একটি স্ট্রিং পেতে আশা করি
ব্যবহারকারী থেকে.
>> কিন্তু এখন আমরা scanf বলা প্রয়োজন অন্য একটি বিষয় -
স্ট্রিং রাখতে যে যেখানে ব্যবহারকারীর উপলব্ধ করা হয়.
ওয়েল, আমি বেশ সহজভাবে শুরু করা যাচ্ছে না কমা গুলি, আমি চাই যে উল্লেখ সঙ্গে
scanf সেখানে স্ট্রিং লাগাতে.
আমি পরের কিছু প্রিন্ট আউট চলেছি % s-এর জন্য printf, "ধন্যবাদ ভালো
ব্যাকস্ল্যাশ এন কমা. "এবং হিসাবে সবসময়, আমি আছি স্ট্রিং, এস পাস করতে যাচ্ছে.
এখন, এর সংরক্ষণ যাক সঙ্কলন, এবং এই রান আমরা প্রবৃত্ত করতে পারে না, যদি প্রোগ্রাম, এবং দেখুন
সমস্যা আমি পূর্বাভাস.
>> Scanf -1 করুন.
./scanf-1.
স্ট্রিং করুন.
এর মত কিছু প্রদান করা যাক "হ্যালো." "নাল জন্য ধন্যবাদ." হুম, যে না
আমি আশা ছিল কি.
তাই এখানে করছেন?
>> আমরা ঘোষণা, কারণ ভাল, এটি সক্রিয় আউট গুলি একটি গৃহস্থালি তারকা হিসেবে কিন্তু আমরা না
আসলে একটি ঠিকানা গুলি মধ্যে সংরক্ষিত মেমরি প্রকৃত খণ্ড, scanf না
স্ট্রিং করা যে কোন জায়গা আছে যে টাইপ ইন ইউজার
প্রকৃতপক্ষে, ইউজার হলে এখন টাইপ "হ্যালো" চেয়ে অনেক লম্বা পংক্তি
উদাহরণস্বরূপ বিভিন্ন টেক্সট লাইনের বা লেখার বেশ কিছু অনুচ্ছেদ, এটা বেশ এর
আমরা প্রবৃত্ত হতে পারে যে সম্ভব একটি সেগমেন্টেশন ফল্ট তথাকথিত.
>> Scanf জানা যাচ্ছে না কারণ যে আমি আসলে একটি ঠিকানা করান নি
গুলি ভেতরে.
বরং, এটা কিছু মান দেখতে যাচ্ছে গুলি করে, কিছু প্যাটার্ন বিট যে may
খুব ভাল একটা আবর্জনা মান হতে, সেখানে শুধু সুযোগ দ্বারা.
এবং scanf এখনও লিখতে চেষ্টা যাচ্ছে যে ঠিকানায় ব্যবহারকারীর স্ট্রিং,
এটি একটি গার্বেজ মান, এমনকি যদি যা প্রকৃতপক্ষে একটি ক্র্যাশ রাজি করানো যায়নি.
>> সুতরাং কিভাবে আমরা এই ঠিক করতে যাচ্ছে?