ما هي أنواع السلسلة الأكثر استخداما في C ++ وكيفية تحويلها بينهما؟

StackOverflow https://stackoverflow.com/questions/944516

  •  09-09-2019
  •  | 
  •  

سؤال

أو كيف لا تقتل نفسك أو شخصا ما في المرة التالية، يقوم برنامج التحويل البرمجي C ++ بتقليل ذراعك للتحويل بين 2 أنواع السلسلة التعسفي فقط للفوضى معك؟

لدي ترميز الوقت الصعب في C ++ منذ أن كنت معتادا على VB6، C #، Ruby، لعمليات السلسلة. ولكن الآن قضيت أكثر من 30 دقيقة في محاولة لتسجيل السلسلة التي تحتوي على 2 GUID وسلسلة إلى نافذة التصحيح ... ولا تحصل على أي أسهل وقد قابلت بالفعل RPC_WSTR, std::wstring و LPCWSTR

هل هناك قواعد بسيطة (أو أي) لمعرفة التحويلات بينهما؟ أو هل يأتي إلا بعد سنوات من التعذيب؟

في الأساس أنا أبحث عن أنواع السلسلة الأكثر استخداما في كل من مكتبات برمجة التطبيقات القياسية و MS-C ++ MS-C ++؛ ماذا تفعل في المرة القادمة، أرى

Error   8   error C2664: 'OutputDebugStringW' : cannot convert parameter 1 from 'std::wstring' to 'LPCWSTR'

تحديث: قمت بإصلاح خطأ ^^^^ ترجمة. أنا أبحث عن إجابة عالمية أكثر وليس للحل القضية المحددة التي أدرجتها كمثال.

هل كانت مفيدة؟

المحلول

هناك نوعان من أنواع السلسلة المدمجة:

  • C ++ Strings استخدم فئة STD :: سلسلة (STD :: WSTRING للأحرف الواسعة)
  • سلاسل نمط C هي مؤشرات const char const char *) (أو const wchar_t*)

كلاهما يمكن استخدامه في رمز C ++. تتم كتابة معظم API، بما في ذلك Windows "في C، وهكذا يستخدمون مؤشرات Char بدلا من فئة STD :: سلسلة.

تخفي Microsoft المزيد من هذه المؤشرات خلف عدد من وحدات الماكرو.

lpcwstr هو مؤشر طويل إلى سلسلة واسعة, ، أو بمعنى آخر، const wchar_t*.

LPSTR هو مؤشر طويل إلى سلسلة, ، أو بمعنى آخر، char* (لا const).

لديهم حفنة أكثر، لكن يجب أن يكون من السهل جدا تخمينكم بمجرد معرفة هذه القلة الأولى. لديهم أيضا * متغيرات TSTR، حيث يتم استخدام T للإشارة إلى أن هذا قد يكون إما حمايات منتظمة أو واسعة، اعتمادا على ما إذا كان Unicode ممكن في المشروع. يحل LPCTTR إلى LPCWSTR إذا تم تعريف Unicode، و LPSTR خلاف ذلك.

حقا، عند العمل مع سلاسل، تحتاج فقط إلى معرفة النوعين الذي أدرجته في الأعلى. الباقي هو وحدات ماكرو فقط لمتغيرات مختلفة من إصدار مؤشر Char.

التحويل من مؤشر char إلى سلسلة بسيط:

const char* cstr = "hello world";
std::string cppstr = cstr;

والطريقة الأخرى ليست هادر كثيرا:

std::string cppstr("hello world");
const char* cstr = cppstr.c_str();

إنه، std::string يأخذ سلسلة نمط C كوسيطة في المنشئ. وله c_str() وظيفة الأعضاء التي ترجع سلسلة نمط C.

تحدد بعض المكتبات الشائعة المستخدمة أنواع السلسلة الخاصة بها، وفي تلك الحالات، يجب عليك التحقق من الوثائق الخاصة بكيفية تكوين فئات السلسلة "المناسبة".

يجب أن تفضل عادة C ++ std::string فئة، كما، على عكس مؤشرات تشار، هم تصرف كسلاسل. علي سبيل المثال:

std:string a = "hello ";
std:string b = "world";
std:string c = a + b; // c now contains "hello world"

const char* a = "hello ";
const char* b = "world";
const char* c = a + b; // error, you can't add two pointers

std:string a = "hello worl";
char b = 'd';
std:string c = a + b; // c now contains "hello world"

const char* a = "hello worl";
char b = 'd';
const char* c = a + b; // Doesn't cause an error, but won't do what you expect either. the char 'd' is converted to an int, and added to the pointer `a`. You're doing pointer arithmetic rather than string manipulation.

نصائح أخرى

هنا هو شرط التي تغطي الشيء الذي تحتاجه أساسا ل cstring

OutputDebugStringW (myString.c_str ());

مرحبا بك في C ++ ؛-)

يمكنك فقط إنشاء وظيفة غلاف يقبل std::string. وبعد ثم في وظيفة استخراج سلسلة نمط C وتمرير إلى OutputDebugStringW.

std::wstring و std::string هي مجرد الأسماء المستعارة ل std::basic_string<wchar_t> و std::basic_string<char>.

كلاهما لديه .c_str()-Method الذي يعيد مؤشر سلسلة التقليدية (LPCWSTR وما إلى ذلك) ومناضل يأخذ سلسلة C.

قد ترغب في النظر في cstdstring.. وبعد إنه تطبيق Cross Platform C ++ CTRING يحول إلى معظم أنواع السلسلة الأخرى بسهولة. يجعل جميع الصداع ذات الصلة تقريبا يذهب بعيدا وملف واحد فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top