হুবহু কী মনে হচ্ছে, ধরে নিই যে আপনি সংক্ষেপে যেভাবে সি এবং ইউএনএক্স শব্দ ব্যবহার করেছেন তা ব্যবহার করছেন, এটি স্ট্রিকে নকল করে :-)
এটি আসলে আইএসও সি স্ট্যান্ডার্ড নিজেই (ক) (এটি একটি পসিক্স বিষয়) এর অংশ নয়, এটি কার্যকরভাবে নিম্নলিখিত কোডের মতোই করছে:
char *strdup(const char *src) {
char *dst = malloc(strlen (src) + 1); // Space for length plus nul
if (dst == NULL) return NULL; // No memory
strcpy(dst, src); // Copy the characters
return dst; // Return the new string
}
অন্য কথায়:
এটি পুরানো স্ট্রিং ধরে রাখতে পর্যাপ্ত মেমরি বরাদ্দ করার চেষ্টা করে (স্ট্রিংয়ের শেষে চিহ্নিত করতে একটি '\ 0' অক্ষর)।
যদি বরাদ্দটি ব্যর্থ হয় তবে তা সেট errno
হয়ে যায় ENOMEM
এবং NULL
সঙ্গে সঙ্গে ফিরে আসে returns সেটিং errno
থেকে ENOMEM
কিছু malloc
POSIX মধ্যে আছে তাই আমরা স্পষ্টভাবে আমাদের এটা করতে প্রয়োজন হবে না strdup
। আপনি যদি পসিক্স অনুগত না হন , আইএসও সি আসলে এর অস্তিত্বের আদেশ দেয় না ENOMEM
তাই আমি এটিকে এখানে (বি) অন্তর্ভুক্ত করি নি ।
অন্যথায় বরাদ্দ কাজ করেছিল তাই আমরা পুরানো স্ট্রিংটিকে নতুন স্ট্রিংয়ে (গ) অনুলিপি করে নতুন ঠিকানাটি (যা কলারটি কিছুটা সময় মুক্ত করার জন্য দায়ী ) ফিরিয়ে দেয়।
মাথায় রাখুন যে ধারণা সংজ্ঞা। যে কোনও লাইব্রেরি লেখক তাদের বেতনের মূল্যবান নির্দিষ্ট প্রসেসরটি লক্ষ্য করে প্রচুর অপ্টিমাইজড কোড সরবরাহ করেছেন।
(ক) তবে, শুরু হওয়া ফাংশন str
এবং একটি ছোট কেস লেটার ভবিষ্যতের দিকনির্দেশের জন্য মান দ্বারা সংরক্ষিত। থেকে C11 7.1.3 Reserved identifiers
:
প্রতিটি শিরোনাম তার সম্পর্কিত সাব-ক্লজ-এ তালিকাবদ্ধ সমস্ত সনাক্তকারীকে ঘোষণা করে বা সংজ্ঞায়িত করে এবং * এটি সম্পর্কিত ভবিষ্যতের গ্রন্থাগারের দিকনির্দেশের উপ-ধারাটিতে তালিকাভুক্ত সনাক্তকারীকে বিকল্পভাবে ঘোষণা বা সংজ্ঞা দেয়। **
এর জন্য ভবিষ্যতের দিকনির্দেশগুলি string.h
পাওয়া যাবে C11 7.31.13 String handling <string.h>
:
ফাংশন নাম যে দিয়ে শুরু str
, mem
অথবা wcs
এবং ছোট হাতের অক্ষর মধ্যে ঘোষণা যোগ করা যেতে পারে <string.h>
হেডার।
সুতরাং আপনি যদি নিরাপদে থাকতে চান তবে আপনার সম্ভবত এটি অন্য কিছু বলা উচিত।
(খ) পরিবর্তনটি মূলত এর if (d == NULL) return NULL;
সাথে প্রতিস্থাপন করবে :
if (d == NULL) {
errno = ENOMEM;
return NULL;
}
(গ) নোট করুন যে আমি এটির strcpy
জন্য ব্যবহার করেছি যেহেতু এটি স্পষ্টভাবে উদ্দেশ্যটি দেখায়। কিছু বাস্তবায়নে এটি দ্রুততর হতে পারে (যেহেতু আপনি ইতিমধ্যে দৈর্ঘ্যটি জানেন) memcpy
কারণ তারা বড় অংশগুলিতে বা সমান্তরালভাবে ডেটা স্থানান্তর করতে পারে। অথবা এটি নাও পারে :-) অপ্টিমাইজেশন মন্ত্র # 1: "পরিমাপ, অনুমান করবেন না"।
যাই হোক না কেন, আপনি যদি সেই পথে যাওয়ার সিদ্ধান্ত নেন, আপনি এমন কিছু করবেন:
char *strdup(const char *src) {
size_t len = strlen(src) + 1; // String plus '\0'
char *dst = malloc(len); // Allocate space
if (dst == NULL) return NULL; // No memory
memcpy (dst, src, len); // Copy the block
return dst; // Return the new string
}