ورود

View Full Version : تبدیل CString به [ ] char



zahmatkesh8519
سه شنبه 23 خرداد 1391, 17:12 عصر
سوال اول :
با این کد تبدیل فقط منحصر به کاراکتر اول رشته می شه ، چطور همه کاراکتر ها تبدیل می شن ؟
char *pBuffer = new char[10];
CString strBuf = _T("Test");
pBuffer =(char *) strBuf.GetBuffer(sizeof(pBuffer));

سوال دوم :
در جاهایی هم چون از نوع های w دار مثل CStringW استفاده کردم موقع تبدیل یه خونه در میون فاصله دار می شه . دلیلش مشخصه ولی آیا راهی برای برگشتش و تبدیل به یک خونه هست ؟
مثلا رشته P r o g r a m چطور می شه تبدیل به رشته Program کرد ؟

mehdi.mousavi
سه شنبه 23 خرداد 1391, 18:50 عصر
سوال اول : با این کد تبدیل فقط منحصر به کاراکتر اول رشته می شه ، چطور همه کاراکتر ها تبدیل می شن ؟
char *pBuffer = new char[10];
CString strBuf = _T("Test");
pBuffer =(char *) strBuf.GetBuffer(sizeof(pBuffer));


سلام.
کدی که نوشته همون ایراد سوال دوم رو داره. در واقع pBuffer[0] همون T هستش، pBuffer[1] صفر هستش، pBuffer[2] حرف بعدی در Test یعنی e و الی آخر و چون Index دوم صفر هستش، بنابراین مابقی رشته رو نمی بینید و تصور کرده اید که فقط کاراکتر اول رشته کپی شده. البته کدی که نوشته اید صحیح نیست، چرا که sizeof(pBuffer) همواره 4 هستش. شما باید Len اون رشته رو بگیرید و به GetBuffer بدید...



سوال دوم : در جاهایی هم چون از نوع های w دار مثل CStringW استفاده کردم موقع تبدیل یه خونه در میون فاصله دار می شه . دلیلش مشخصه ولی آیا راهی برای برگشتش و تبدیل به یک خونه هست ؟
مثلا رشته P r o g r a m چطور می شه تبدیل به رشته Program کرد ؟

برای رفع این مشکل، باید با استفاده از تابع WideCharToMultiByte رشته مورد نظر رو از Unicode به ASCII تبدیل کنید. در ساده ترین حالت:

char szMultiByte[255] = {NULL};

wchar_t *p = L"Test";
int nLen = WideCharToMultiByte(CP_ACP, 0, p, -1, NULL, NULL, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, p, -1, szMultiByte, nLen, NULL, NULL);

موفق باشید.

zahmatkesh8519
سه شنبه 23 خرداد 1391, 22:21 عصر
برادر خیلی ممنون . راه حل خوبیه . ولی مشکل اینجا پیش بیاد که این کاراکتر ها فارسی باشن و بخوای به کاراکتر هایی توی خونه های آرایه char تبدیل بشن . یعنی دیگه فارسی نمومونن ( مشخصه ، چون فارسی از یونی کد استفده می کنه) .
حالا این کد زیر هم مشکل بنده رو حل کرده .
CStringW fff = L"c:\\ProgسیبamFiles\\testname\\A.exe\r\n";
dwBytesToWrite = (DWORD) fff.GetLength()*2 ;
اما مشکل اینجا بود که برای استفاده از تابع writefile و ارسالی متنی برای نوشتن در فایل ، فیلد مربوته که از نوع LPCVOID بود مقدار []char را بهش می دادم و... و الان با کد بالا مشکل الحمد الله رفع شد .
بازم تشکر برادر هم بایت این راهنمایی و هم راهنمایی هایی که تو سایت گزاشتی و ازشون استفاده کردم . خدا عوضش رو بهت به بهترین حالتش بده .:قلب: