কিভাবে স্ট্যান্ড :: স্ট্রিংকে এলপিসিএসটিতে রূপান্তর করবেন?


111

আমি কিভাবে রূপান্তর করতে পারেন std::stringকরতে LPCSTR? এছাড়াও কেমন করে আমার রূপান্তর করতে পারেন std::stringকরতে LPWSTR?

আমি এগুলি LPCSTR LPSTR LPWSTRএবং সম্পূর্ণরূপে বিভ্রান্ত LPCWSTR

হয় LPWSTRএবং LPCWSTRএকই?

উত্তর:


114

str.c_str()আপনাকে এমন একটি দেয় const char *যা একটি LPCSTR(দীর্ঘ পয়েন্টার টু কনস্ট্যান্ট স্ট্রাস্টিং) - এর অর্থ এটি 0অক্ষরের সমাপ্ত স্ট্রিংয়ের পয়েন্টার । Wঅর্থ প্রশস্ত স্ট্রিং (এর wchar_tপরিবর্তে গঠিত char)।


5
গৌণ পিক পয়েন্ট: x64 এলপিসিএসটিতে একটি (ধ্রুবক) নাল-টার্মিনেটেড স্ট্রিংয়ের জন্য একটি 64-বিট পয়েন্টার হবে।
জোয়েল

154

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-বিট উইন্ডোজ থেকে একটি হোল্ডওভার।


32

এগুলি হ'ল মাইক্রোসফ্ট সংজ্ঞায়িত টাইপিডফ যা সম্পর্কিত:

এলপিসিএসটিআর: নাল টার্মিনেটেড কনস্ট্রিং স্ট্রিংয়ের পয়েন্টার 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;
}

18

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
}

4

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


3

রূপান্তরটি সহজ:

std :: স্ট্রিং str; এলপিসিএসআরটি lpcstr = str.c_str ();


3

রূপান্তর সহজ:

std::string myString;

LPCSTR lpMyString = myString.c_str();

এখানে একটি বিষয় সাবধানতা অবলম্বন করা হ'ল সি_স্ট্রাই মাইস্ট্রিংয়ের একটি অনুলিপি ফিরিয়ে দেয় না, তবে স্ট্র্যান্ড :: স্ট্রিং মোড়কে অক্ষরযুক্ত স্ট্রিংয়ের কেবলমাত্র একটি পয়েন্টার। আপনি যদি একটি অনুলিপি চান / প্রয়োজন থাকেন তবে আপনাকে নিজেরাই তৈরি করতে হবে strcpy ব্যবহার করে।


1

সবচেয়ে সহজ উপায় একটি রূপান্তর করতে std::stringএকটি থেকেLPWSTR আমার মতে হল:

  1. রূপান্তর করুন std::string একটি থেকেstd::vector<wchar_t>
  2. wchar_tভেক্টরের প্রথম ঠিকানাটি নিন ।

std::vector<wchar_t>একটি টেমপ্লেট করা ctor যা যেমন দুই iterators, নিয়ে মাঠে যাব! std::string.begin()এবং .end()iterators। wchar_tযদিও এটি প্রতিটি চরকে একটিতে রূপান্তর করবে । std::stringইউনিকোডের মানগুলি যেভাবে ল্যাটিন -1 মানগুলির সাথে সাদৃশ্য রয়েছে তার কারণে এটিতে কেবলমাত্র ASCII বা লাতিন -1 রয়েছে valid যদি এতে সিপি 1252 বা অন্য কোনও এনকোডিংয়ের অক্ষর থাকে তবে এটি আরও জটিল। এরপরে আপনাকে অক্ষরগুলি রূপান্তর করতে হবে।


কেন ব্যবহার std::wstringকরবেন না ?
টিম্ম্ম্ম

@ টিম্ম্ম্ম: সি ++ 11 স্পেসিফিকেশনটিকে আরও জোরদার করেছে কারণ বাস্তবায়নগুলি পুরানো বিধিগুলির সুবিধা নেয় নি, আজ এটি ঠিক আছে।
এমসাল্টার্স

1
std::string myString("SomeValue");
LPSTR lpSTR = const_cast<char*>(myString.c_str());

মাইস্ট্রিং হ'ল ইনপুট স্ট্রিং এবং এলপিএসটিআর এটি এলপিসিআর সমতুল্য।

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