সব পারি স্ট্রিং একটি বিবেচনা করা অক্ষরের অ্যারে ( হ্যাঁ ), সব করতে চরিত্র অ্যারে বিবেচনা করা স্ট্রিং ( কোন )।
কেন না? এবং কেন এটি গুরুত্বপূর্ণ?
স্ট্রিংয়ের অংশ হিসাবে স্ট্রিংয়ের দৈর্ঘ্য কোথাও সংরক্ষণ করা হয়নি এবং স্ট্রিং সংজ্ঞায়িত এমন স্ট্যান্ডার্ডের রেফারেন্সের পাশাপাশি অন্যান্য উত্তরগুলির পাশাপাশি, ফ্লিপ-সাইডটি "সি লাইব্রেরি ফাংশনগুলি স্ট্রিংগুলি কীভাবে পরিচালনা করবে?"
যখন কোনও অক্ষর অ্যারে একই অক্ষর ধারণ করতে পারে তবে এটি কেবল অক্ষরের একটি অ্যারে না হয় যদি না শেষ অক্ষরটি নুল-টার্মিনেটিং অক্ষর অনুসরণ না করে । সেই নুল-টার্মিনেটিং চরিত্রটি হ'ল অক্ষরের অ্যারেটিকে স্ট্রিং হিসাবে বিবেচনা করতে (যেমন পরিচালনা করা) অনুমতি দেয়।
সি এর সমস্ত ফাংশন যা আর্গুমেন্ট হিসাবে একটি স্ট্রিং প্রত্যাশা করে অক্ষরের অনুক্রমটি বাতিল-সমাপ্ত হওয়ার প্রত্যাশা করে । কেন?
এটি সমস্ত স্ট্রিং ফাংশনগুলি যেভাবে কাজ করে তা করতে হবে। যেহেতু দৈর্ঘ্য একটি অ্যারের অংশ হিসাবে অন্তর্ভুক্ত করা হয়নি, স্ট্রিং-ফাংশন, নাল-চরিত্রের (যেমন '\0'
- দশমিকের সমতুল্য 0
) সন্ধান না পাওয়া পর্যন্ত অ্যারেতে স্ক্যান করুন । দেখুন হওয়া ASCII টেবিল এবং বর্ণনা । তথাপি কিনা আপনি ব্যবহার করছেন strcpy
, strchr
, strcspn
, ইত্যাদি .. সকল স্ট্রিং ফাংশন উপর নির্ভর nul-সসীম চরিত্র উপস্থিত হচ্ছে নির্ধারণ করতে যেখানে যে পংক্তি শেষ হয়।
দুটি অনুরূপ ক্রিয়াকলাপের তুলনা নুল-সমাপ্তি চরিত্রের string.h
গুরুত্বকে জোর দেবে । উদাহরণস্বরূপ নিন:
char *strcpy(char *dest, const char *src);
strcpy
ফাংশন কেবল কপি থেকে বাইট src
থেকে dest
পর্যন্ত nul-সসীম চরিত্র পাওয়া যায় বলার strcpy
যেখানে অক্ষর অনুলিপি থামাতে। এখন অনুরূপ ফাংশন নিন memcpy
:
void *memcpy(void *dest, const void *src, size_t n);
ফাংশনটি একই ক্রিয়াকলাপ সম্পাদন করে তবে src
প্যারামিটারটিকে স্ট্রিং হিসাবে বিবেচনা করে না বা প্রয়োজন হয় না । যেহেতু নুল-টার্মিনেটিং চরিত্রটি না পাওয়া পর্যন্ত memcpy
কেবল src
অনুলিপি করে বাইটগুলি অনুলিপি করতে পারে dest
না , তৃতীয় প্যারামিটার হিসাবে অনুলিপি করার জন্য এটি স্পষ্ট সংখ্যক বাইটের প্রয়োজন। এই তৃতীয় প্যারামিটার একই আকারের তথ্য সরবরাহ করে কেবল কোনও নুল-টার্মিনেটিং চরিত্র না পাওয়া পর্যন্ত সামনে স্ক্যান করে সহজেই উত্পন্ন করতে সক্ষম হয় ।memcpy
strcpy
(যা strcpy
কোনও স্ট্রিংয়ের প্রত্যাশা করা কোনও ফাংশন (বা স্ট্রিংয়ের প্রত্যাশা করা কোনও ফাংশন) এও জোর দেয় ) যদি আপনি ফাংশনটি নুল-টার্মিনেটেড স্ট্রিং সরবরাহ করতে ব্যর্থ হন - কোথায় থামবেন তা কোনও ধারণা নেই এবং আপনার বাকি মেমরি বিভাগে খুশি হয়ে ছুটে যাবে it invoking অনির্ধারিত আচরণ একটি পর্যন্ত nul-অক্ষর শুধু মেমরি কোথাও পাওয়া যাবে এরকম - অথবা একটি সেগমেন্টেশন ফল্ট পড়ে)
যে কেন একটি আশা ফাংশন nul-সমাপ্ত স্ট্রিং একটি প্রেরণ করা আবশ্যক nul-সমাপ্ত STRING এবং কেন এটা গুরুত্বপূর্ণ ।
char str[] = "hello";
।