উত্তর:
str.c_str()আপনাকে এমন একটি দেয় const char *যা একটি LPCSTR(দীর্ঘ পয়েন্টার টু কনস্ট্যান্ট স্ট্রাস্টিং) - এর অর্থ এটি 0অক্ষরের সমাপ্ত স্ট্রিংয়ের পয়েন্টার । Wঅর্থ প্রশস্ত স্ট্রিং (এর wchar_tপরিবর্তে গঠিত char)।
c_str()একটি থেকে একটি const char *( LPCSTR) পেতে কল std::string।
এটি সব নামে:
LPSTR - (দীর্ঘ) স্ট্রিংয়ের পয়েন্টার - char *
LPCSTR - (দীর্ঘ) স্থির স্ট্রিংয়ের পয়েন্টার - const char *
LPWSTR - (দীর্ঘ) ইউনিকোড (প্রশস্ত) স্ট্রিংয়ের পয়েন্টার - wchar_t *
LPCWSTR - (দীর্ঘ) স্থির ইউনিকোড (প্রশস্ত) স্ট্রিংয়ের পয়েন্টার - const wchar_t *
LPTSTR - (দীর্ঘ) টিসিএইচএআরের দিকে নির্দেশক (ইউনিকোড সংজ্ঞায়িত হলে ইউনিকোড, এএনএসআই না থাকলে) স্ট্রিং - TCHAR *
LPCTSTR - (দীর্ঘ) ধ্রুবক TCHAR স্ট্রিংয়ের পয়েন্টার - const TCHAR *
আপনি নামের এল (দীর্ঘ) অংশটিকে উপেক্ষা করতে পারেন - এটি 16-বিট উইন্ডোজ থেকে একটি হোল্ডওভার।
এগুলি হ'ল মাইক্রোসফ্ট সংজ্ঞায়িত টাইপিডফ যা সম্পর্কিত:
এলপিসিএসটিআর: নাল টার্মিনেটেড কনস্ট্রিং স্ট্রিংয়ের পয়েন্টার char
এলপিএসটিআর: নাল টার্মিনেটেড চর স্ট্রিংয়ের পয়েন্টার char(প্রায়শই একটি বাফার পাস হয়ে 'আউটপুট' প্যারাম হিসাবে ব্যবহৃত হয়)
এলপিসিডব্লিউএসটিআর: কনস্টের নাল টার্মিনেটেড স্ট্রিংয়ের পয়েন্টার wchar_t
এলপডব্লিউএসটিআর: নাল টার্মিনেটেড স্ট্রিংয়ের পয়েন্টার wchar_t(প্রায়শই একটি বাফার পাস হয়ে 'আউটপুট' প্যারাম হিসাবে ব্যবহৃত হয়)
এটিকে std::stringএকটি এলপিসিএসটিতে "রূপান্তর" করা সঠিক প্রসঙ্গে নির্ভর করে তবে সাধারণত কলিং .c_str()যথেষ্ট।
এইটা কাজ করে.
void TakesString(LPCSTR param);
void f(const std::string& param)
{
TakesString(param.c_str());
}
মনে রাখবেন যে আপনার এমন কিছু করার চেষ্টা করা উচিত নয়।
LPCSTR GetString()
{
std::string tmp("temporary");
return tmp.c_str();
}
ফেরত বাফারটি উদাহরণের .c_str()মালিকানাধীন std::stringএবং স্ট্রিংটি পরবর্তী পরিবর্তন বা ধ্বংস না হওয়া পর্যন্ত কেবল বৈধ হবে।
একটি রূপান্তর করতে std::stringএকটি থেকে LPWSTRজটিল। একটি সূচনা চাইলে LPWSTRবোঝা যায় যে আপনার একটি পরিবর্তনযোগ্য বাফার প্রয়োজন এবং আপনার নিশ্চিত হওয়াও দরকার যে কী অক্ষরটি এনকোডিংstd::string ব্যবহার করছে তা আপনি বুঝতে পেরেছেন । যদি std::stringসিস্টেম ডিফল্ট এনকোডিং ব্যবহার করে স্ট্রিং থাকে (উইন্ডোজ ধরে এখানে), তবে আপনি প্রয়োজনীয় প্রশস্ত অক্ষরের বাফারের দৈর্ঘ্যটি খুঁজে পেতে এবং MultiByteToWideChar(একটি উইন 32 এপিআই ফাংশন) ব্যবহার করে ট্রান্সকোডিং সম্পাদন করতে পারেন ।
যেমন
void f(const std:string& instr)
{
// Assumes std::string is encoded in the current Windows ANSI codepage
int bufferlen = ::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), NULL, 0);
if (bufferlen == 0)
{
// Something went wrong. Perhaps, check GetLastError() and log.
return;
}
// Allocate new LPWSTR - must deallocate it later
LPWSTR widestr = new WCHAR[bufferlen + 1];
::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), widestr, bufferlen);
// Ensure wide string is null terminated
widestr[bufferlen] = 0;
// Do something with widestr
delete[] widestr;
}
LPWSTRআপনি ব্যবহার করে স্ট্রিংয়ের বিষয়বস্তু যেখানে এটি নির্দেশ করে তা পরিবর্তন করতে পারে। LPCWSTRআপনি ব্যবহার করে স্ট্রিংয়ের বিষয়বস্তু যেখানে এটি নির্দেশ করে তা পরিবর্তন করতে পারে না।
std::string s = SOME_STRING;
// get temporary LPSTR (not really safe)
LPSTR pst = &s[0];
// get temporary LPCSTR (pretty safe)
LPCSTR pcstr = s.c_str();
// convert to std::wstring
std::wstring ws;
ws.assign( s.begin(), s.end() );
// get temporary LPWSTR (not really safe)
LPWSTR pwst = &ws[0];
// get temporary LPCWSTR (pretty safe)
LPCWSTR pcwstr = ws.c_str();
LPWSTRমূল স্ট্রিংয়ের পয়েন্টার মাত্র। উপরের নমুনাটি ব্যবহার করে আপনাকে এটিকে ফাংশন থেকে ফেরানো উচিত নয়। অস্থায়ী না হওয়ার জন্য LPWSTRআপনাকে গাদাতে মূল স্ট্রিংয়ের একটি অনুলিপি তৈরি করা উচিত। নীচের নমুনা পরীক্ষা করুন:
LPWSTR ConvertToLPWSTR( const std::string& s )
{
LPWSTR ws = new wchar_t[s.size()+1]; // +1 for zero at the end
copy( s.begin(), s.end(), ws );
ws[s.size()] = 0; // zero at the end
return ws;
}
void f()
{
std::string s = SOME_STRING;
LPWSTR ws = ConvertToLPWSTR( s );
// some actions
delete[] ws; // caller responsible for deletion
}
MultiByteToWideCharউত্তর চার্লস বেইলি দিলেন সঠিক অন্যতম। কারণ LPCWSTRএটি কেবল একটি টাইপিডেফ const WCHAR*, widestrউদাহরণ কোডটিতে যেখানেই LPWSTRপ্রত্যাশিত বা যেখানে প্রত্যাশিত সেখানে ব্যবহার করা যেতে পারে LPCWSTR।
std::vector<WCHAR>একটি ম্যানুয়ালি ম্যানেজ করা অ্যারের পরিবর্তে একটি ছোটখাটো সাম্প্রতিক কান্ডটি ব্যবহার করা উচিত:
// using vector, buffer is deallocated when function ends
std::vector<WCHAR> widestr(bufferlen + 1);
::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), &widestr[0], bufferlen);
// Ensure wide string is null terminated
widestr[bufferlen] = 0;
// no need to delete; handled by vector
এছাড়াও, শুরু করার জন্য আপনার যদি প্রশস্ত স্ট্রিংগুলির সাথে কাজ করার প্রয়োজন হয় তবে আপনি এর std::wstringপরিবর্তে ব্যবহার করতে পারেন std::string। আপনি যদি উইন্ডোজ TCHARটাইপের সাথে কাজ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন std::basic_string<TCHAR>। থেকে রূপান্তর std::wstringকরতে LPCWSTRবা থেকে std::basic_string<TCHAR>থেকে LPCTSTRকলিং শুধু একটি ব্যাপার c_str। এটি যখন আপনি এএনএসআই এবং ইউটিএফ -16 অক্ষরের মধ্যে পরিবর্তন করেন যা MultiByteToWideChar(এবং এর বিপরীত WideCharToMultiByte) ছবিতে আসে into
রূপান্তর সহজ:
std::string myString;
LPCSTR lpMyString = myString.c_str();
এখানে একটি বিষয় সাবধানতা অবলম্বন করা হ'ল সি_স্ট্রাই মাইস্ট্রিংয়ের একটি অনুলিপি ফিরিয়ে দেয় না, তবে স্ট্র্যান্ড :: স্ট্রিং মোড়কে অক্ষরযুক্ত স্ট্রিংয়ের কেবলমাত্র একটি পয়েন্টার। আপনি যদি একটি অনুলিপি চান / প্রয়োজন থাকেন তবে আপনাকে নিজেরাই তৈরি করতে হবে strcpy ব্যবহার করে।
সবচেয়ে সহজ উপায় একটি রূপান্তর করতে std::stringএকটি থেকেLPWSTR আমার মতে হল:
std::string একটি থেকেstd::vector<wchar_t>wchar_tভেক্টরের প্রথম ঠিকানাটি নিন ।std::vector<wchar_t>একটি টেমপ্লেট করা ctor যা যেমন দুই iterators, নিয়ে মাঠে যাব! std::string.begin()এবং .end()iterators। wchar_tযদিও এটি প্রতিটি চরকে একটিতে রূপান্তর করবে । std::stringইউনিকোডের মানগুলি যেভাবে ল্যাটিন -1 মানগুলির সাথে সাদৃশ্য রয়েছে তার কারণে এটিতে কেবলমাত্র ASCII বা লাতিন -1 রয়েছে valid যদি এতে সিপি 1252 বা অন্য কোনও এনকোডিংয়ের অক্ষর থাকে তবে এটি আরও জটিল। এরপরে আপনাকে অক্ষরগুলি রূপান্তর করতে হবে।
std::wstringকরবেন না ?