Вопрос по c++, visual-c++ – Преобразование строки ATL CString в массив символов

4

Я хочу преобразоватьCString вchar[], Какое-то тело говорит мне, как это сделать?

Мой код такой:

CString strCamIP1 = _T("");
char g_acCameraip[16][17];
strCamIP1 = theApp.GetProfileString(strSection, _T("IP1"), NULL);
g_acCameraip[0] = strCamIP1;
Благодаря всем вам я решил это с помощью метода WideCharToMultiByte следующим образом:TCHAR tchCamIPTemp[15]; _tcscpy(tchCamIPTemp, strCamIP1); WideCharToMultiByte(CP_ACP, 0, tchCamIPTemp, -1, g_acCameraip[0], sizeof(g_acCameraip[0]), NULL, NULL); Vaibhav

Ваш Ответ

12   ответов
0

char c [25];
Cstring cstr = "123";
memcpy(c,cstr,cstr.GetLength());
2

вы можете использовать один из макросов преобразования. CString хранит данные как tchar, поэтому вы должны использовать CT2A () (C в имени макроса обозначает const):

CString from("text");

char* pStr = CT2A((LPCTSTR)from);

Эти макросы умные, если tchar представляет ascii (не определен _UNICODE), они просто передают указатель и ничего не делают.

Более подробная информация ниже, подATL String-Conversion Classes раздел: http://www.369o.com/data/books/atl/index.html?page=0321159624%2Fch05.html

Мне это нравится:CString from("text"); CT2A pStr(from);
0

CString a = L"This is CString!";
char *dest = (char *)malloc(a.GetLength() + 1);
// +1 because of NULL char

dest[a.GetLength()] = 0; // setting null char

char *q = (char *)a.m_pszData;
//Here we cannot access the private member..
//The address of "m_pszData" private member is stored in first DWORD of &a...
//Therefore..

int address = *((int *)&a);

char *q = (char *)address;
// Now we can access the private data!, This is the real magic of C
// Size of CString's characters is 16bit...
// in cstring '1' will be stored as 0x31 0x00 (Hex)
// Here we just want even indexed chars..

for(int i = 0;i<(a.GetLength()*2);i += 2)
  dest[i/2] = *(q+i);

// Now we can use it..
printf("%s", dest);

0
It's simple

ATL CStrings позволяют очень простое использование без большого количества преобразований между типами. Вы можете легко сделать:

const char* str = static_cast<LPCTSTR>(cs);

или в среде UNICODE:


const wchar_t* str = static_cast<LPCTSTR>(cs);
How it works

static_cast (или в качестве альтернативы C-Style)CString::operator LPCTSTRТаким образом, вы не делаете никакой реинтерпретации указателя самостоятельно, а полагаетесь на код ATL!

Документация этого оператора приведения говорит:

This useful casting operator provides an efficient method to access the null-terminated C string contained in a CString object. No characters are copied; only a pointer is returned. Be careful with this operator. If you change a CString object after you have obtained the character pointer, you may cause a reallocation of memory that invalidates the pointer.

Modifiable Pointers

Как упомянуто в приведенном выше утверждении, возвращаемый указатель оператором приведенияnot meant to be modified, Однако, если вам все еще нужно использовать модифицируемый указатель для некоторых устаревших библиотек C, вы можете использоватьconst_cast (если вы уверены, что функция не изменит указатель):

void Func(char* str) // or wchar_t* in Unicode environment
{
    // your code here
}

// In your calling code:

Func(const_cast<LPTSTR>(static_cast<LPCTSTR>(test))); // Call your function with a modifiable pointer

Если вы хотите изменить указатель, вы не будете делать какое-то копирование памяти в изменяемую память, как упоминалось в других ответах.

0
    CString str;
    //Do something
    char* pGTA = (LPTSTR)(LPCTSTR)str;//Now the cast

0

CStringA/W дешево и неявно конвертируется вconst char/wchar_t *, Всякий раз, когда вам нужна строка в стиле C, просто передайтеCString сам объект (или результат.GetString() что то же самое). Указатель останется действительным, пока строковый объект жив и не изменен.

// OR
strcpy(g_acCameraip[0], strCamIP1.GetString());

Если вам нужен доступный для записи (неконстантный) буфер, используйте.GetBuffer() с необязательным аргументом максимальной длины.

Если у вас естьCStringW но тебе нужноconst char* и наоборот, вы можете использовать временныйCStringA объект:

strcpy(g_acCameraip[0], CStringA(strCamIP1).GetString());

Но гораздо лучше было бы иметь массивCStrings. Вы можете использовать их везде, где вам нужна строка с нулевым символом в конце, но они также будут управлять памятью строки для вас.

std::vector<CString> g_acCameraip(16);
g_acCameraip[0] = theApp.GetProfileString(strSection, _T("IP1"), NULL);
0

really долженcopy CString объекты в фиксированнойchar массивы?

enum { COUNT=16 };
CString Cameraip[COUNT];
Cameraip[0] = theApp.GetProfileString(strSection, _T("IP1"), NULL);
// add more entries...

... а затем - позже - при доступе к записям, например, так

for (int i=0; i<COUNT; ++i) {
    someOp(Cameraip[i]); // the someOp function takes const CString&
}

...ты можешьпреобразовать их, if необходимо.

0

которая нуждается в char * param. так что если у вас есть CString в качестве доступной строки, вы можете просто использовать приведенный ниже код. будь счастлив :) Вот,cFDlg.GetPathName().GetString(); в основном возвращает CString в моем коде.

char*pp  = (char*)cFDlg.GetPathName().GetString();
FILE *fp = ::fopen(pp,"w");
3

wcstombs_s:

// Convert CString to Char By Quintin Immelman.
//
CString DummyString;
// Size Can be anything, just adjust the 100 to suit. 
const size_t StringSize = 100;
// The number of characters in the string can be
// less than String Size. Null terminating character added at end.
size_t CharactersConverted = 0;

char DummyToChar[StringSize];

wcstombs_s(&CharactersConverted, DummyToChar, 
       DummyString.GetLength()+1, DummyString, 
       _TRUNCATE);
//Always Enter the length as 1 greater else 
//the last character is Truncated
Единственный ответ здесь, который работал для меня.
0
char strPass[256];
strcpy_s( strPass, CStringA(strCommand).GetString() );
7

MSDN сайт:

// Convert to a char* string from CStringA string 
// and display the result.
CStringA origa("Hello, World!");
const size_t newsizea = (origa.GetLength() + 1);
char *nstringa = new char[newsizea];
strcpy_s(nstringa, newsizea, origa);
cout << nstringa << " (char *)" << endl;

CString основан наTCHAR так что если вы не компилируете с_UNICODE это & APOS; sCStringA или если вы компилируете с_UNICODE тогда этоCStringW.

В случаеCStringW конверсия выглядит немного иначе (пример также изMSDN):

// Convert to a char* string from a wide character 
// CStringW string. To be safe, we allocate two bytes for each
// character in the original string, including the terminating
// null.
const size_t newsizew = (origw.GetLength() + 1)*2;
char *nstringw = new char[newsizew];
size_t convertedCharsw = 0;
wcstombs_s(&convertedCharsw, nstringw, newsizew, origw, _TRUNCATE );
cout << nstringw << " (char *)" << endl;
origw.GetLength () * 2 +1 тоже будет хорошо?
7

http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx

CString aCString = "A string";
char myString[256];
strcpy(myString, (LPCTSTR)aString);

который в вашем случае будет по линии

strcpy(g_acCameraip[0], (LPCTSTR)strCamIP1);
mistype: \ CString aCString = & quot; Строка & quot ;; char myString [256]; strcpy (myString, (LPCTSTR) aString);
Это не сработало в 1-й строке: не существует подходящего конструктора для преобразования из "const char [9]" to & quot; ATL :: CStringT & lt; wchar_t, StrTraitMFC & lt; wchar_t, ATL :: ChTraitsCRT & lt; wchar_t & gt; & gt; & gt;
Имо, это лучший и самый простой способ сделать это. Если вы хотите использовать C ++ приведение, вы можете сделатьstatic_cast<LPCTSTR>(cstringVar) и он будет работать под Unicode и MBCS.
Я получил ошибку какerror C2664: 'strcpy' : cannot convert parameter 2 from 'const unsigned short *' to 'const char * Vaibhav

Похожие вопросы