সি স্ট্রিংগুলি কি সর্বদা বাতিল হয়, বা এটি প্ল্যাটফর্মের উপর নির্ভর করে?


13

এই মুহুর্তে আমি এমবেডেড সিস্টেমগুলির সাথে কাজ করছি এবং কোনও অপারেটিং সিস্টেম নেই এমন একটি মাইক্রোপ্রসেসরের উপর স্ট্রিংগুলি প্রয়োগ করার উপায়গুলি সন্ধান করছি। এখন পর্যন্ত আমি যা করছি তা হ'ল নূলে সমাপ্ত চরিত্রের পয়েন্টার থাকার ধারণাটি ব্যবহার করা এবং সেগুলি স্ট্রিং হিসাবে বিবেচনা করা হবে যেখানে নূলে শেষটি চিহ্নিত করে। আমি জানি যে এটি মোটামুটি সাধারণ, তবে আপনি কি সর্বদা এটির হিসাবে গণ্য করতে পারেন ?

আমার জিজ্ঞাসার কারণটি হ'ল আমি সম্ভবত কোনও সময় রিয়েল টাইম অপারেটিং সিস্টেমটি ব্যবহার করার বিষয়ে ভাবছিলাম এবং আমি আমার বর্তমান কোডটি যতটা সম্ভব পুনরায় ব্যবহার করতে চাই। সুতরাং সেখানে থাকা বিভিন্ন পছন্দগুলির জন্য, আমি কি স্ট্রিংগুলি একইভাবে কাজ করার আশা করতে পারি?

আমার মামলার ক্ষেত্রে যদিও আমাকে আরও নির্দিষ্ট করা উচিত। আমি এমন একটি সিস্টেম বাস্তবায়ন করছি যা সিরিয়াল পোর্টের মাধ্যমে কমান্ড গ্রহণ করে প্রক্রিয়া করে। আমি কি আমার কমান্ড প্রসেসিং কোডটি একই রাখতে পারি এবং তারপরে RTOS- এ তৈরি হওয়া স্ট্রিং অবজেক্টগুলি (যা কমান্ডগুলি ধারণ করে) সকলকে NULL সমাপ্ত করার আশা করতে পারি? অথবা, এটি ওএসের ভিত্তিতে আলাদা হবে?

হালনাগাদ

এই প্রশ্নটি একবার দেখার পরামর্শ দেওয়ার পরেও আমি স্থির করেছি যে আমি যা বলছি তা ঠিক উত্তর দেয় না। প্রশ্নটি নিজেই জিজ্ঞাসা করছে যে কোনও স্ট্রিংয়ের দৈর্ঘ্য সর্বদা পাস করা উচিত যা আমি যা বলছি তার থেকে সম্পূর্ণ আলাদা এবং যদিও কিছু উত্তরগুলির মধ্যে দরকারী তথ্য ছিল তবে সেগুলি আমি যা খুঁজছি ঠিক তা নয়। উত্তর সেখানে কেন অথবা কেন দিতে করলো না একটি নাল অক্ষর দিয়ে একটি স্ট্রিং বিনষ্ট। আমি যা জিজ্ঞাসা করছি তার সাথে পার্থক্য হ'ল আমি যদি কমপক্ষে বিভিন্ন প্ল্যাটফর্মের জন্মগত স্ট্রিংগুলি নাল দিয়ে তাদের নিজস্ব স্ট্রিংগুলি বাদ দেওয়ার আশা করতে পারি, বাইরে না গিয়ে এবং সেখানে প্রতিটি একক প্ল্যাটফর্ম চেষ্টা করেই বোঝা যায়।


3
আমি দীর্ঘদিন ধরে সি ব্যবহার করি নি, তবে আমি এমন কোনও সময়ের কথা ভাবতে পারি না যখন আমি এমন একটি বাস্তবায়নের দিকে ধাবিত হয়েছি যা নুল-টার্মিনেটেড স্ট্রিং ব্যবহার করে না। এটি স্ট্যান্ডার্ড সি এর অংশ, যদি আমি সঠিকভাবে মনে করি (যেমন আমি বলেছিলাম, কিছুক্ষণ হয়ে গেছে ...)
মেটালমাইকস্টার

1
আমি সি-তে বিশেষজ্ঞ নই, তবে যতদূর আমি জানি সি এর সমস্ত স্ট্রিং চরের অ্যারে, নাল-টার্মিনেটেড। আপনি নিজের স্ট্রিং প্রকারটি তৈরি করতে পারেন তবে আপনাকে নিজের দ্বারা সমস্ত স্ট্রিং ম্যানিপুলেশন ফাংশন প্রয়োগ করতে হবে।
মাচাডো


1
@ মেটালমিক্সটার আপনি কী ভাবেন যে এই তথ্যটি স্ট্যান্ডার্ড সি স্পিকে পাওয়া যাবে?
স্নুপ

3
@ স্নুপি সম্ভবত হ্যাঁ। তবে সত্যিকার অর্থে, সি-তে স্ট্রিংয়ের কথা বলার সময়, তারা কেবলমাত্র একটি বর্ণের অ্যারে যা শেষ হয় NULL এর সাথে এবং এটি হ'ল যদি আপনি কোনও ধরণের অ-স্ট্যান্ডার্ড স্ট্রিং লাইব্রেরি ব্যবহার না করেন তবে আমরা এখানে যেভাবেই কথা বলছি তা নয়। আমি সন্দেহ করি আপনি এমন একটি প্ল্যাটফর্ম খুঁজে পাবেন যা এটি সম্মান করে না, বিশেষত সি এর একটি শক্তির সাথে বহনযোগ্যতা।
মেটালমাইকেস্টার

উত্তর:


42

যে জিনিসগুলিকে "সি স্ট্রিংস" বলা হয় সেগুলি যে কোনও প্ল্যাটফর্মে নਾਲ-টার্মিনেট করা হবে। স্ট্যান্ডার্ড সি লাইব্রেরি ফাংশনগুলি কোনও স্ট্রিংয়ের শেষ নির্ধারণ করে।

সি ভাষার ভিতরে, এমন কোনও অক্ষর নেই যা শেষ করে না এমন অক্ষরের অ্যারে রাখা থেকে বিরত থাকে। তবে স্ট্রিংয়ের শেষে এড়াতে আপনাকে অন্য কিছু পদ্ধতি ব্যবহার করতে হবে।


4
শুধু যোগ করতে; স্ট্রিংয়ের দৈর্ঘ্যের উপর নজর রাখার জন্য আপনার কোথাও কোনও পূর্ণসংখ্যা থাকে এবং এটি সঠিকভাবে করার জন্য আপনি একটি কাস্টম ডেটা স্ট্রাকচার দিয়ে শেষ করেন, কিউটিতে কিউস্ট্রিং শ্রেণির
রুডলফ

8
দৃষ্টিতে কেস: আমি একটি সি প্রোগ্রামের সাথে কাজ করি যা কমপক্ষে পাঁচটি পৃথক স্ট্রিং ফর্ম্যাট ব্যবহার করে: নাল-টার্মিনেটেড charঅ্যারে, charপ্রথম বাইটে এনকোড করা দৈর্ঘ্যের অ্যারে (সাধারণত "পাস্কাল স্ট্রিংস" হিসাবে পরিচিত), wchar_tউভয়ের উভয় ভিত্তিক সংস্করণ উপরে এবং charঅ্যারে যা উভয় পদ্ধতি একত্রিত করে: প্রথম বাইটে এনকোড দৈর্ঘ্য এবং স্ট্রিংটি সমাপ্ত করে একটি নাল অক্ষর।
চিহ্নিত করুন

4
@ মার্ক ইন্টারফেসিং প্রচুর তৃতীয় পক্ষের উপাদান / অ্যাপ্লিকেশন বা কোনও লিগ্যাসি কোড মেসের সাথে?
ড্যান ইজ ফিডলিং বাই ফায়ারলাইট

2
@ ড্যানিয়েলি, উপরের সমস্তগুলি ক্লাসিক ম্যাকোএসের সাথে ইন্টারফেসিংয়ের জন্য পাস্কাল স্ট্রিং, অভ্যন্তরীণ ব্যবহারের জন্য সি স্ট্রিং এবং উইন্ডোজ, ইউনিকোড সমর্থন যুক্ত করার জন্য প্রশস্ত স্ট্রিং এবং জাস্টার্ড স্ট্রিং কারণ কেউ চালাক হওয়ার চেষ্টা করেছিল এবং এমন স্ট্রিং তৈরি করেছিল যা একই সাথে ম্যাকওএস এবং উইন্ডোজ উভয়ের সাথে ইন্টারফেস করতে পারে।
চিহ্নিত করুন

1
@ মার্ক ... এবং অবশ্যই কারিগরি debtণ পরিশোধের জন্য কেউ অর্থ ব্যয় করতে রাজি নয় কারণ ক্লাসিক ম্যাকওএস দীর্ঘ মৃত, এবং জাস্টার্ড স্ট্রিংগুলি প্রতিবার স্পর্শ করার প্রয়োজন হলে এটি একটি ডাবল ক্লাস্টারফ্রাক। আমার সহানুভূতি
ড্যান ইজ ফিডলিং বাই ফায়ারলাইট

22

টার্মিনেটিং চরিত্রের নির্ধারণ আক্ষরিকের জন্য সংকলক এবং সাধারণ স্ট্রিংয়ের জন্য স্ট্যান্ডার্ড লাইব্রেরির প্রয়োগের উপর নির্ভর করে। এটি অপারেটিং সিস্টেম দ্বারা নির্ধারিত হয় না।

NULসমাপ্তির কনভেনশনটি প্রাক-মান সি-তে ফিরে যায় এবং 30+ বছরের মধ্যে আমি বলতে পারি না যে আমি এমন পরিবেশে চলে এসেছি যা অন্য কিছু করে। এই আচরণটি C89 তে কোডেড হয়েছিল এবং সি ভাষা মানের অংশ হিসাবে অবিরত রয়েছে (লিঙ্কটি C99 এর খসড়ার জন্য রয়েছে):

  • বিভাগ 6.4.5 NULস্ট্রিং আক্ষরিকের NULসাথে যুক্ত হওয়া আবশ্যক করে নির্ধারিত স্ট্রিংগুলির জন্য মঞ্চ নির্ধারণ করে ।
  • বিভাগ 7.1.1 স্ট্রিংটিকে "প্রথম নাল অক্ষর দ্বারা সমাপ্ত এবং অক্ষরযুক্ত একটি অক্ষরের ক্রম" হিসাবে সংজ্ঞা দিয়ে স্ট্যান্ডার্ড লাইব্রেরির ফাংশনে এনেছে ।

অন্য কোনও চরিত্র দ্বারা বন্ধ হওয়া স্ট্রিংগুলি হ্যান্ডেলগুলি কারও লিখতে পারে না তার কোনও কারণ নেই, তবে বেশিরভাগ ক্ষেত্রে প্রতিষ্ঠিত স্ট্যান্ডার্ডটিকে পট করার কোনও কারণ নেই যতক্ষণ না আপনার লক্ষ্য প্রোগ্রামারগুলি ফিট করে। :-)


2
এর একটি কারণ হ'ল বারবার একই স্ট্রিংয়ের শেষ সন্ধান করতে হবে।
পাওলো ইবারম্যান

@ Pa @loEbermann রাইট একের পরিবর্তে দুটি মান পাস করার ব্যয়ে। যদি আপনি কেবল একটি স্ট্রিংটিকে আক্ষরিক হিসাবে পাস করেন তবে এটি কিছুটা উদাসীন printf("string: \"%s\"\n", "my cool string")। এই ক্ষেত্রে চারটি পরামিতিগুলি পাস করার একমাত্র উপায় (কোনও ধরণের টার্মিনেশন বাইট ব্যতীত) স্ট্রিংটিকে std::stringসি ++ এর মতো কিছু হিসাবে সংজ্ঞায়িত করা হবে , যার নিজস্ব সমস্যা এবং সীমাবদ্ধতা রয়েছে।
--মাস্টার

1
বিভাগ 6.4.5 নাল অক্ষর দিয়ে সমাপ্ত করতে একটি স্ট্রিং আক্ষরিক প্রয়োজন হয় না । এটা তোলে স্পষ্টভাবে নোট " একটি অক্ষর স্ট্রিং আক্ষরিক দরকার নেই একটি স্ট্রিং হতে (7.1.1 দেখুন), কারণ একটি নাল অক্ষর একটি \ 0 পালাবার ক্রম দ্বারা এটি এমবেড করা হতে পারে। "
bzeaman

1
@bzeaman পাদটীকা বলেছেন যে আপনি একটি স্ট্রিং আক্ষরিক তৈরি করতে পারেন যা কোনও স্ট্রিংয়ের .1.১.১ সংজ্ঞাটি পূরণ করে না, তবে এর সাথে বর্ণিত বাক্যটি কমপ্লায়ার NULসংকলকগুলি বলে-যা নির্বিশেষে তাদের নির্ধারণ করুন: "অনুবাদ পর্বে 7, একটি বাইট বা কোড শূন্যের মান প্রতিটি মাল্টবাইট অক্ষর ক্রমের সাথে সংযুক্ত করা হয় যা স্ট্রিং আক্ষরিক বা আক্ষরিক থেকে ফলাফল হয়। .1.১.১ এর সংজ্ঞা ব্যবহার করে লাইব্রেরির ফাংশনগুলি NULতারা খুঁজে পায় প্রথমে থেমে যায় এবং এটি জানতে পারে না যে এর বাইরে অতিরিক্ত অক্ষর রয়েছে।
blrfl

আমি সংশোধন করেছি. আমি 'নাল' এর মতো বিভিন্ন পদ অনুসন্ধান করেছি কিন্তু 'মান শূন্য' উল্লেখ করে 6.৪.৫.৫ মিস করেছি।
bzeaman

3

আমি এম্বেড থাকা সিস্টেমের সাথে কাজ করছি ... কোনও অপারেটিং সিস্টেম ছাড়াই ... আমি ... নূলে সমাপ্ত চরিত্রের পয়েন্টার রাখার ধারণাটি ব্যবহার করছি এবং সেগুলি এনআরএলটি শেষের চিহ্ন হিসাবে চিহ্নিত করে ings আমি জানি যে এটি মোটামুটি সাধারণ, তবে আপনি কি সর্বদা এটির হিসাবে গণ্য করতে পারেন?

সি ভাষায় স্ট্রিং ডেটা টাইপ নেই তবে স্ট্রিং লিটারেল রয়েছে

আপনি যদি আপনার প্রোগ্রামটিতে একটি স্ট্রিং আক্ষরিক রাখেন, তবে এটি সাধারণত NUL সমাপ্ত হবে (তবে নীচের মন্তব্যে আলোচিত বিশেষ কেসটি দেখুন)) এর অর্থ হ'ল আপনি যদি "foobar"এমন কোনও স্থানে রাখেন যেখানে কোনও const char *মান প্রত্যাশিত হয় তবে সংকলকটি নির্গত হবে foobar⊘আপনার প্রোগ্রামের কনস্ট / কোড সেগমেন্ট / বিভাগে এবং অভিব্যক্তির মান ঠিকানার যেখানে ঠিকানা fঅক্ষর রেখেছিল তার পয়েন্টার হবে । (দ্রষ্টব্য: আমি NUL বাইট বোঝাতে ব্যবহার করছি ।)

কেবলমাত্র অন্য অর্থে সি ভাষায় স্ট্রিং রয়েছে, এর কিছু মানক গ্রন্থাগার রয়েছে যা NUL সমাপ্ত অক্ষর অনুসারে কাজ করে। এই লাইব্রেরির রুটিনগুলি খালি ধাতব পরিবেশে অস্তিত্ব থাকবে না যদি না আপনি সেগুলি নিজের পোর্ট করেন।

এগুলি কেবল কোড --- আপনি নিজেরাই লিখেছেন এমন কোডের থেকে আলাদা নয়। আপনি এগুলি বন্দরে রাখার সময় যদি সেগুলি না ভাঙেন তবে তারা সর্বদা যা করে তা তারা করবে (উদাহরণস্বরূপ, NUL- এ থামুন))


2
পুনঃ: "আপনি যদি আপনার প্রোগ্রামটিতে একটি স্ট্রিং আক্ষরিক রেখে দেন, এটি সর্বদা NUL সমাপ্ত হবে": আপনি কি সে সম্পর্কে নিশ্চিত? আমি নিশ্চিত যে (উদাহরণস্বরূপ) char foo[4] = "abcd";চারটি অক্ষরের নন-নল-টার্মিনেটেড অ্যারে তৈরি করার একটি বৈধ উপায় pretty
রুখ

2
@রুখ, উফ! এটি এমন একটি মামলা যা আমি বিবেচনা করি নি। আমি একটি স্ট্রিং আক্ষরিক সম্পর্কে ভাবছিলাম যা এমন জায়গায় উপস্থিত হয় যেখানে একটি char const * অভিব্যক্তি প্রত্যাশিত। আমি ভুলে গিয়েছিলাম যে সি ইনিশিয়ালাররা মাঝে মাঝে বিভিন্ন নিয়ম মানতে পারে।
সলোমন স্লো

@ruakh স্ট্রিং আক্ষরিক NUL- সমাপ্ত। অ্যারে হয় না।
জেমসডলিন

2
@ruakh আপনি একটি আছে char[4]। যে নয় একটি স্ট্রিং, কিন্তু এটা ছিল ইনিশিয়ালাইজ এক থেকে
Caleth

2
@ ক্যালাথ, "একের কাছ থেকে আরম্ভ করা" এমন কিছু নয় যা রান সময় হওয়া উচিত। আমরা শব্দ যুক্ত করে থাকেন staticRuakh উদাহরণ, তারপর কম্পাইলার পারে নির্গত একটি NUL একটি সক্রিয়া তথ্য সেগমেন্ট থেকে "ABCD" সমাপ্ত যাতে পরিবর্তনশীল প্রোগ্রাম লোডার দ্বারা সক্রিয়া করা হয়। সুতরাং, রুয়াখ সঠিক ছিল: একটি প্রোগ্রামে একটি স্ট্রিং আক্ষরিক উপস্থিতির জন্য NUL- সমাপ্ত স্ট্রিং নির্গত করার জন্য সংকলকটির প্রয়োজন হয় না এমন একটি ক্ষেত্রে অন্তত একটি ঘটনা রয়েছে। (পিএস, আমি আসলে জিসিসি 5.4.0 দিয়ে উদাহরণটি সংকলন করেছি, এবং সংকলকটি NUL নির্গত করতে পারেনি))
সলোমন স্লো

2

অন্যরা যেমন বলেছে, নখের স্ট্রিংগুলি সি স্ট্যান্ডার্ড লাইব্রেরির একটি সম্মেলন। আপনি যদি স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার না করে থাকেন তবে আপনি স্ট্রিংগুলি যে কোনওভাবে পরিচালনা করতে পারেন।

এটি একটি 'সি' সংকলক সহ যে কোনও অপারেটিং সিস্টেমের ক্ষেত্রে সত্য এবং একই সাথে, আপনি 'সি' প্রোগ্রাম লিখতে পারেন যা সত্য অপারেটিং সিস্টেমের অধীনে চালিত হয় না যেমন আপনি আপনার প্রশ্নে উল্লেখ করেছেন। একটি উদাহরণ হ'ল আমি একবার ডিজাইন করা কালি জেট প্রিন্টারের জন্য নিয়ামক। এম্বেড থাকা সিস্টেমে অপারেটিং সিস্টেমের মেমরির ওভারহেডের প্রয়োজন হতে পারে না।

স্মৃতিশক্তি-সংকীর্ণ পরিস্থিতিতে আমি উদাহরণস্বরূপ, প্রসেসরের নির্দেশক সেট-এর সাথে আমার সংকলকটির বৈশিষ্ট্যগুলি দেখব। একটি অ্যাপ্লিকেশন যেখানে স্ট্রিংগুলি প্রচুর প্রক্রিয়াজাত হয়, স্ট্রিং দৈর্ঘ্যের মতো বর্ণনাকারী ব্যবহার করা বাঞ্ছনীয়। আমি এমন একটি ক্ষেত্রে ভাবছি যেখানে সিপিইউ শর্ট অফসেট এবং / অথবা অ্যাড্রেস রেজিস্টারগুলির সাথে আপেক্ষিক অফসেটগুলির সাথে কাজ করার ক্ষেত্রে বিশেষভাবে দক্ষ।

সুতরাং আপনার আবেদনে কোনটি আরও গুরুত্বপূর্ণ: কোডের আকার এবং দক্ষতা, বা কোনও OS বা লাইব্রেরির সাথে সামঞ্জস্যতা? অন্য বিবেচনা রক্ষণাবেক্ষণ হতে পারে। আপনি সম্মেলন থেকে আরও বিপথগামী, অন্য কারও পক্ষে এটি রক্ষা করা তত বেশি কঠিন।


1

অন্যরা এই সমস্যাটিকে সম্বোধন করেছেন যে সি-তে স্ট্রিংগুলি মূলত আপনি তাদের তৈরি করেন। তবে আপনার প্রশ্নটিতে টার্মিনেটর নিজে থেকেই কিছুটা বিভ্রান্তি রয়েছে বলে মনে হয় এবং এক দৃষ্টিকোণ থেকে, এটি হতে পারে আপনার অবস্থানের কেউ চিন্তিত।

সি স্ট্রিংগুলি নাল-সমাপ্ত হয়। অর্থাৎ এগুলি নাল চরিত্র দ্বারা সমাপ্ত করা হয় NUL,। এগুলি নাল পয়েন্টার দ্বারা শেষ করা হয় না NULL, যা সম্পূর্ণ ভিন্ন উদ্দেশ্য সহ সম্পূর্ণ ভিন্ন ধরণের মান।

NULপূর্ণসংখ্যা মান শূন্যের গ্যারান্টিযুক্ত। স্ট্রিংয়ের মধ্যে এর অন্তর্নিহিত অক্ষরের আকারের আকারও থাকবে যা সাধারণত 1 হবে।

NULLমোটেও একটি পূর্ণসংখ্যা টাইপ থাকার নিশ্চয়তা নেই। NULLএকটি পয়েন্টার প্রসঙ্গে ব্যবহারের উদ্দেশ্যে, এবং সাধারণত একটি পয়েন্টার প্রকারের প্রত্যাশা করা হয়, যা আপনার সংকলকটি কোনও ভাল হলে কোনও চরিত্র বা পূর্ণসংখ্যায় রূপান্তর করা উচিত নয়। NULLগ্লাইফের সংজ্ঞা সংযুক্ত করার সময় 0, এটির মূলত এটির মান [1] থাকার নিশ্চয়তা দেওয়া হয় না এবং যদি না আপনার সংকলক এক ধরণের হিসাবে ধ্রুবকটি প্রয়োগ করে #define(অনেকেই করেন না, কারণ NULL সত্যিকার অর্থে একটি অ- পয়েন্টার প্রসঙ্গে), প্রসারিত কোডটি আসলে শূন্য মানের জড়িত থাকার নিশ্চয়তা দেয় না (যদিও এটি বিভ্রান্তিকরভাবে একটি শূন্য গ্লিফ জড়িত)।

যদি NULLএটি টাইপ করা থাকে তবে এটির আকার 1 (বা অন্য কোনও চরিত্রের আকার) হওয়ারও সম্ভাবনা কম। এটি সম্ভবত অতিরিক্ত সমস্যার কারণ হতে পারে, যদিও প্রকৃত চরিত্রের ধ্রুবকগুলির বেশিরভাগ অংশের জন্য চরিত্রের আকার না থাকে।

এখন বেশিরভাগ লোকেরা এটি দেখতে পাবে এবং ভাববে, "অল-শূন্য-বিট ব্যতীত অন্য কিছু হিসাবে নাল পয়েন্টারটি কী বাজে?" - তবে এর মতো অনুমানগুলি কেবল x86 এর মতো সাধারণ প্ল্যাটফর্মে নিরাপদ। যেহেতু আপনি স্পষ্টভাবে অন্যান্য প্ল্যাটফর্মকে লক্ষ্য করার আগ্রহের কথা উল্লেখ করেছেন, তাই আপনাকে এই বিষয়টি বিবেচনায় নেওয়া উচিত, কারণ আপনি আপনার কোডটি পয়েন্টার এবং পূর্ণসংখ্যার মধ্যে সম্পর্কের প্রকৃতি সম্পর্কে অনুমান থেকে স্পষ্টভাবে আলাদা করেছেন separated

সুতরাং, যখন সি স্ট্রিংগুলি নাল-টার্মিনেট করা হয়, সেগুলি দ্বারা শেষ করা হয় না NULL, তবে NUL(সাধারণত লিখিত '\0') দ্বারা। NULLস্ট্রিং টার্মিনেটর হিসাবে স্পষ্টভাবে ব্যবহার করা কোডটি সরল ঠিকানা কাঠামোর সাথে প্ল্যাটফর্মগুলিতে কাজ করবে এবং অনেক সংকলক দিয়ে সংকলন করবে, তবে এটি একেবারে সঠিক সি নয় C.


[1] সংকলক দ্বারা প্রকৃত নাল পয়েন্টার মান সন্নিবেশ করা হয় যখন এটি একটি প্রসঙ্গে 0 টোকেন পড়ে যেখানে এটি পয়েন্টার ধরণের রূপান্তরিত হবে। এটি পূর্ণসংখ্যার মান 0 থেকে রূপান্তর নয় এবং টোকেন ব্যতীত অন্য কোনও কিছু যদি 0ব্যবহার করা হয় তবে যেমন ধরনের থেকে গতিশীল মান হয় তা ধরে রাখার নিশ্চয়তা নেই ; রূপান্তরটিও পুনরায় পরিবর্তনযোগ্য নয় এবং কোনও পূর্ণসংখ্যায় রূপান্তরিত হলে নাল পয়েন্টারটির মান 0 দিতে হয় না।


দুর্দান্ত পয়েন্ট। এটিকে সাফ করার জন্য আমি একটি সম্পাদনা জমা দিয়েছি।
মন্টি হার্ড

" NULপূর্ণসংখ্যার মান শূন্যের নিশ্চয়তা রয়েছে।" -> সি সংজ্ঞায়িত করে না NUL। পরিবর্তে সি সংজ্ঞায়িত করেছে যে স্ট্রিংগুলিতে একটি চূড়ান্ত নাল
ক্র্যাক্টর রয়েছে,

1

আমি সি তে স্ট্রিং ব্যবহার করে আসছি, এর অর্থ নাল সমাপ্তিযুক্ত অক্ষরগুলিকে স্ট্রিংস বলা হয়।

আপনি যখন বেয়ারমেটাল বা কোনও অপারেটিং সিস্টেম যেমন উইন্ডোজ, লিনাক্স, আরটিএস: (ফ্রিআরটিও, ওএসই) ব্যবহার করেন তখন এতে কোনও সমস্যা হবে না।

এম্বেডড ওয়ার্ল্ডে নাল টার্মিনেশন আসলে স্ট্রিং হিসাবে চরিত্রটিকে টোকেন করতে আরও সহায়তা করে।

আমি সি তে স্ট্রিংগুলি অনেকগুলি সুরক্ষা সমালোচনামূলক সিস্টেমে ব্যবহার করেছি।

আপনি ভাবতে পারেন, সি এর স্ট্রিং আসলে কী?

সি স্টাইলের স্ট্রিংগুলি যা অ্যারে হয় সেখানে স্ট্রিং লিটারেলও রয়েছে যেমন "এটি"। বাস্তবে, এই উভয় স্ট্রিং টাইপ কেবল স্মৃতিতে একে অপরের পাশে বসে থাকা অক্ষরগুলির সংগ্রহ মাত্র।

আপনি যখনই কোনও স্ট্রিং লিখেন, ডাবল উদ্ধৃতিতে আবদ্ধ, সি স্বয়ংক্রিয়ভাবে আমাদের জন্য অক্ষরের একটি অ্যারে তৈরি করে, সেই স্ট্রিংটি থাকে, \ 0 অক্ষর দ্বারা সমাপ্ত হয়।

উদাহরণস্বরূপ, আপনি অক্ষরের একটি অ্যারে ঘোষণা এবং সংজ্ঞায়িত করতে পারেন এবং একটি স্ট্রিং ধ্রুবক দিয়ে এটি আরম্ভ করতে পারেন:

char string[] = "Hello cruel world!";

সোজা উত্তর: আপনার নাল সমাপ্তির সাথে অক্ষরের ব্যবহার সম্পর্কে সত্যই চিন্তা করার দরকার নেই, এটি কোনও প্ল্যাটফর্মের থেকে আলাদা work


ধন্যবাদ, আপনি জানেন না যে যখন ডাবল উদ্ধৃতি দিয়ে ঘোষিত হয়, তখন NULস্বয়ংক্রিয়ভাবে সংযোজন হয়।
স্নুপ

1

যেমনটি অন্যরা বলেছেন, নাল সমাপ্তি স্ট্যান্ডার্ড সি এর জন্য বেশ সার্বজনীন তবে অন্যরা যেমন উল্লেখ করেছেন) ১০০% নয়। (অন্য) উদাহরণস্বরূপ, VMS অপারেটিং সিস্টেম সাধারণত কি এটা "STRING বর্ণনাকারী" বলা ব্যবহৃত http://h41379.www4.hpe.com/commercial/c/docs/5492p012.html দ্বারা সি অ্যাক্সেস #include <descrip.h >

অ্যাপ্লিকেশন-স্তরের স্টাফগুলি নাল টার্মিনেশন বা না ব্যবহার করতে পারে, তবে বিকাশকারী উপযুক্ত দেখেন। তবে নিম্ন-স্তরের ভিএমএস স্টাফের জন্য একেবারে বর্ণনাকারী প্রয়োজন, যা একেবারে নাল সমাপন ব্যবহার করে না (বিশদগুলির জন্য উপরের লিঙ্কটি দেখুন)। এটি মূলত তাই যাতে সমস্ত ভাষা (সি, সমাবেশ ইত্যাদি) যা সরাসরি ভিএমএস ইন্টার্নাল ব্যবহার করে তাদের সাথে একটি সাধারণ ইন্টারফেস থাকতে পারে।

সুতরাং যদি আপনি কোনও ধরণের অনুরূপ পরিস্থিতি অনুমান করে থাকেন তবে "সার্বজনীন নাল সমাপ্তি" প্রয়োজনীয় পরামর্শ দেওয়ার চেয়ে আপনি কিছুটা বেশি যত্নবান হতে চাইতে পারেন। আপনি যা করছেন আমি যদি তা করছিলাম তবে আমি আরও যত্নবান হব, তবে আমার অ্যাপ্লিকেশন-স্তরের স্টাফের জন্য নাল সমাপ্তি ধরে নেওয়া নিরাপদ। আমি আপনাকে কেবল একই স্তরের সুরক্ষা প্রস্তাব করব না। আপনার কোডটির কিছুটা ভবিষ্যতের সময়ে অ্যাসেম্বলি এবং / অথবা অন্যান্য ভাষা কোডের সাথে ইন্টারফেস থাকতে পারে, যা সর্বদা নাল-টার্মিনেটেড স্ট্রিংয়ের সি স্ট্যান্ডার্ড অনুসারে নাও পারে।


আজ, 0 সমাপ্তি আসলে বেশ অস্বাভাবিক। সি ++ স্টাডি :: স্ট্রিং করে না, জাভা স্ট্রিং করে না, উদ্দেশ্য-সি এনএসএসটিং করছে না, সুইফট স্ট্রিং করে না - ফলস্বরূপ, প্রতিটি ভাষার লাইব্রেরি স্ট্রিংয়ের ভিতরে নুল কোড সহ স্ট্রিংগুলিকে সমর্থন করে (যা সি দিয়ে অসম্ভব) সুস্পষ্ট কারণে স্ট্রিং)।
gnasher729

@ gnasher729 আমি "... বেশ কিছুটা সার্বজনীন" "স্ট্যান্ডার্ড সি'র জন্য প্রায় সার্বজনীন" পরিবর্তিত হয়েছি, যা আমি আশা করি যে কোনও অস্পষ্টতা দূর করে এবং আজ সঠিক রয়ে গেছে (এবং ওপি'র বিষয় এবং প্রশ্ন অনুসারে আমি এর অর্থ কী)।
জন ফোরকোশ

0

আমার এম্বেড করা, সুরক্ষার সমালোচনা এবং বাস্তব সময় সিস্টেমগুলির অভিজ্ঞতায় সি এবং পাস্কাল উভয় স্ট্রিং কনভেনশনই ব্যবহার করা অর্থাত্ প্রথম অক্ষর হিসাবে স্ট্রিংয়ের দৈর্ঘ্য সরবরাহ করা (যা দৈর্ঘ্যকে 255 সীমাবদ্ধ করে) এবং শেষটি শেষ করা অস্বাভাবিক নয় is কমপক্ষে একটি 0x00, ( NUL) দিয়ে স্ট্রিং , যা ব্যবহারের আকার 254 এ হ্রাস করে।

এর একটি কারণ হ'ল প্রথম বাইট প্রাপ্ত হওয়ার পরে আপনি কতটা ডেটা প্রত্যাশা করছেন তা জানা এবং অন্যটি হ'ল, এই জাতীয় সিস্টেমে যেখানে সম্ভব সেখানে গতিশীল বাফার আকারগুলি এড়ানো যায় - একটি নির্দিষ্ট 256 বাফার আকার বরাদ্দ করা দ্রুত এবং নিরাপদ, (না mallocব্যর্থ হয়েছে কিনা তা যাচাই করা দরকার । আরেকটি হ'ল আপনি যে অন্যান্য সিস্টেমগুলির সাথে যোগাযোগ করছেন সেগুলি এএনএসআই-সিতে লিখিত নাও হতে পারে।

যে কোনও এম্বেড থাকা কাজের ক্ষেত্রে একটি ইন্টারফেস কন্ট্রোল ডকুমেন্ট (আইডিসি) স্থাপন করা এবং বজায় রাখা গুরুত্বপূর্ণ, যা আপনার যোগাযোগের সমস্ত কাঠামোকে স্ট্রিং ফর্ম্যাট, অন্তর্নিহিতা, পূর্ণসংখ্যার আকার ইত্যাদির সংজ্ঞা দেয়, যত তাড়াতাড়ি সম্ভব, ( আদর্শভাবে শুরু করার আগে ), এবং এটি আপনার হওয়া উচিত, এবং সব দল, ধর্মগ্রন্থ যখন সিস্টেম লেখার - কেউ ইচ্ছাকে একটি নতুন কাঠামো প্রবর্তন বা বিন্যাস এটি যদি আবশ্যক সেখানে নথিভুক্ত করা প্রথম এবং সবাই যে অবহিত প্রভাবিত হতে পারে, সম্ভবত ভেটো পরিবর্তন করার জন্য একটি বিকল্প সঙ্গে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.