আমার একটি প্রাইভেট ক্লাস ভেরিয়েবল রয়েছে char name[10]যাতে আমি .txtএক্সটেনশনটি যুক্ত করতে চাই যাতে ডিরেক্টরিটিতে উপস্থিত ফাইলটি খুলতে পারি।
কিভাবে আমি এই সম্পর্কে যান?
একটি নতুন স্ট্রিং ভেরিয়েবল তৈরি করা ভাল be
উত্তর:
প্রথমত, ব্যবহার করবেন না char*বা char[N]। ব্যবহার করুন std::string, তারপরে অন্য সবকিছু এত সহজ হয়ে যায়!
উদাহরণ,
std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!
সহজ, তাই না?
এখন আপনার যদি char const *কোনও কারণে প্রয়োজন হয় যেমন যেমন আপনি যখন কোনও ফাংশনে যেতে চান তবে আপনি এটি করতে পারেন:
some_c_api(s.c_str(), s.size());
এই ফাংশন ধরে নিলাম হিসাবে ঘোষণা করা হয়:
some_c_api(char const *input, size_t length);
এক্সপ্লোর std::stringনিজেকে এখান থেকে শুরু:
আশা করি এইটি কাজ করবে.
যেহেতু এটি সি ++ এর std::stringপরিবর্তে ব্যবহার করবেন না char*? প্রতিযোগিতা তুচ্ছ হবে:
std::string str = "abc";
str += "another";
operator+=একটি হ্রাস এবং বরাদ্দ উভয়ই সম্পাদন করে। আমরা সাধারণত সবচেয়ে ব্যয়বহুল ক্রিয়াকলাপগুলির মধ্যে গাদা বরাদ্দ।
আপনি যদি সি তে প্রোগ্রামিং nameকরছিলেন , তবে ধরে নেওয়া সত্যিই আপনি যেমন বলছেন ঠিক এমন একটি নির্দিষ্ট দৈর্ঘ্যের অ্যারে, আপনাকে নীচের মতো কিছু করতে হবে:
char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...
আপনি এখন দেখুন কেন সবাই সুপারিশ করেন std::string?
পোর্ট করা সি লাইব্রেরি থেকে একটি স্ট্রিকাট () ফাংশন রয়েছে যা আপনার জন্য "সি স্টাইল স্ট্রিং" কনকনেটেশন করবে।
বিটিডাব্লু সি-স্টাইলের স্ট্রিংগুলি মোকাবেলা করার জন্য সি ++ এর অনেকগুলি কার্যকারিতা থাকলেও আপনি চেষ্টা করে নিজের ফাংশনটি নিয়ে আসার পক্ষে এটি আপনার পক্ষে উপকারী হতে পারে, এরকম কিছু:
char * con(const char * first, const char * second) {
int l1 = 0, l2 = 0;
const char * f = first, * l = second;
// step 1 - find lengths (you can also use strlen)
while (*f++) ++l1;
while (*l++) ++l2;
char *result = new char[l1 + l2];
// then concatenate
for (int i = 0; i < l1; i++) result[i] = first[i];
for (int i = l1; i < l1 + l2; i++) result[i] = second[i - l1];
// finally, "cap" result with terminating null char
result[l1+l2] = '\0';
return result;
}
...এবং তারপর...
char s1[] = "file_name";
char *c = con(s1, ".txt");
... যার ফলাফল file_name.txt।
আপনার নিজের লেখার প্রলুব্ধ হতে পারে operator +তবে আইআরসি অপারেটর কেবলমাত্র পয়েন্টার দিয়ে ওভারলোডগুলি যুক্তি অনুমোদিত না হওয়ায়।
এছাড়াও, ভুলে যাবেন না এই ক্ষেত্রে ফলাফলটি পরিবর্তনশীলভাবে বরাদ্দ করা হয়েছে, যাতে আপনি মেমরির ফাঁস এড়াতে এটিকে মুছতে কল করতে চাইতে পারেন, বা স্ট্যাক বরাদ্দ করা অক্ষর অ্যারে ব্যবহার করার জন্য আপনি ফাংশনটি সংশোধন করতে পারেন, অবশ্যই যথেষ্ট পরিমাণে তার দৈর্ঘ্য রয়েছে provided
strncat()সাধারণত আরও ভাল বিকল্প রয়েছে এমন ফাংশন রয়েছে
strncatএখানে অপ্রাসঙ্গিক, কারণ আমরা ইতিমধ্যে দ্বিতীয় প্যারামিটারটির দৈর্ঘ্য জানি ".txt"। সুতরাং এটি ঠিক হবে strncat(name, ".txt", 4), যা আমাদের কিছুই লাভ করে না।
স্ট্রিকাট (গন্তব্য, উত্স) সি ++ এ দুটি স্ট্রিং যোগ করতে ব্যবহার করা যেতে পারে।
গভীর বোঝার জন্য আপনি নীচের লিঙ্কটিতে দেখতে পারেন-
পুরানো স্টাইলের সি স্ট্রিংয়ের পরিবর্তে সি ++ স্ট্রিং ক্লাস ব্যবহার করা ভাল, জীবন অনেক সহজ হবে।
যদি আপনার বিদ্যমান পুরাতন স্টাইলের স্ট্রিং থাকে তবে আপনি স্ট্রিং ক্লাসে আবদ্ধ হতে পারেন
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout<<greeting + "and there \n"; //will not compile because concat does \n not work on old C style string
string trueString = string (greeting);
cout << trueString + "and there \n"; // compiles fine
cout << trueString + 'c'; // this will be fine too. if one of the operand if C++ string, this will work too
//String appending
#include <iostream>
using namespace std;
void stringconcat(char *str1, char *str2){
while (*str1 != '\0'){
str1++;
}
while(*str2 != '\0'){
*str1 = *str2;
str1++;
str2++;
}
}
int main() {
char str1[100];
cin.getline(str1, 100);
char str2[100];
cin.getline(str2, 100);
stringconcat(str1, str2);
cout<<str1;
getchar();
return 0;
}