Hanoi 2014 Ответов: 6

CString to const char* ошибка приведения типа


Всем Привет,
У меня есть проблема с литьем типов.
вот этот код:
заголовочный файл:
struct userdata
{
    char strUserName[20];
    char strMsg[100];
};

another.cpp файл:
CString m_txtSend;
strcpy(uinf.strMsg, m_txtSend);

Ошибка:
error C2664: 'strcpy' : cannot convert parameter 2 from 'CString' to 'const char *'

другая ошибка:
cpp файл:
CString sUserName;
sUserName.Format("%s : %s", udata->strUserName, udata->strMsg);

ошибка:
error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [8]' to 'const wchar_t *'
1>        with
1>        [
1>            BaseType=wchar_t,
1>            StringTraits=StrTraitMFC_DLL<wchar_t>
1>        ]
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

пожалуйста, помогите мне.

6 Ответов

Рейтинг:
49

Richard MacCutchan

1. Увидеть CString Операции, относящиеся к строкам в стиле C[^].

2. Вы пытаетесь смешать типы ASCII и Unicode. Воспользуйся CStringA с std::string, или CStringW с std::wstring, чтобы избежать путаницы.


Andreas Gieriet

Мои 5!
Овации
Энди

Richard MacCutchan

Спасибо. Я до сих пор поражаюсь тому, как много "разработчиков" до сих пор не понимают различий.

Albert Holguin

Вероятно, это вина школ, которые недостаточно занимаются этой темой (я бы так подумал). +5

Richard MacCutchan

Спасибо. Это один из многих, к сожалению.

Рейтинг:
40

JackDingler

Другие ответы, которые обсуждают разницу между CStringA и CStringW, являются правильными. Вы имеете дело с проблемой ASCII против Unicode.

Метод Microsoft, чтобы справиться с этим, включает в себя использование нескольких макросов.

TCHAR представляет собой тип символов и автоматически преобразуется в ASCII или Unicode в зависимости от настроек вашего проекта.

LPCSTR это тип defe для преобразования CStringA в const char *
LPCTSTR-это тип defe для преобразования CString в TCHAR *
LPCWSTR-это тип defe для преобразования CString в const wchar_t *

_tcscpy является аналогом strcpy, но будет разрешаться в зависимости от того, к какому tpye будет разрешен TCHAR.

Для этого Microsoft, рекомендуется использовать способ:

struct userdata
{
    TCHAR strUserName[20];
    TCHAR strMsg[100];
}
 
// another.cpp file:
CString m_txtSend;
_tcscpy(uinf.strMsg, m_txtSend);




CString sUserName;
sUserName.Format("%s : %s", udata->strUserName, udata->strMsg);



Если вы должны использовать char, то есть способ заставить это работать, если вы знаете, что ваши строки всегда будут ASCII.


struct userdata
{
    char strUserName[20];
    char strMsg[100];
}

// another.cpp file:
CString m_txtSend;
strcpy(uinf.strMsg, (LPCSTR) (CStringA) m_txtSend);


При использовании формата для преобразования между Unicode и ASCII или наоборот, используйте верхний регистр %S.

CString sUserName;
sUserName.Format("%S : %S", udata->strUserName, udata->strMsg);


Hanoi 2014

Спасибо, это была очень хорошая помощь!

Рейтинг:
2

ranjithkumar81

вы получите помощь отсюда

http://stackoverflow.com/questions/859304/convert-cstring-to-const-char[^]


Рейтинг:
1

vijith.squadz

Видеть это

char ch[20];
CString cs(L"Hai");
CStringA csA(cs);
strcpy(ch , csA.GetBuffer());
кка.Метод releasebuffer();


Рейтинг:
0

LOUIS Christian

Привет,
Вы должны использовать функцию GetBuffer из класса CString следующим образом:

int len = m_txtSend.Length();
char* buffer = m_txtSend.getBuffer(len);
strcpy(uiinf.strMsg,buffer); // show to use strcpy_s function that is more secure
m_txtSend.ReleaseBuffer(); // not omit this call 


С уважением.


Рейтинг:
0

Member 13586981

CString str; //str = некоторая назначенная строка
константный тип char* функция cchar = (константный тип char*)стр.GetBuffer(0);


Stefan_Lang

Некроирование 6 летних проблем никому не помогает

rico_5150

Вы ошибаетесь, мистер Лэнг. Эти старые сообщения очень полезны. Хотя я не уверен, какую пользу принес ваш пост...

Stefan_Lang

Я позволю себе не согласиться. Большинство вопросов либо относятся к конкретной проблеме, которая представляет интерес только для оригинального плаката - который вряд ли заинтересуется ответом в ближайшие месяцы или даже годы. В противном случае это может быть вопрос, который задается снова и снова в аналогичной форме здесь, в stackoverflow или в другом месте - и его будет легко найти с помощью соответствующего поиска в интернете.

Не говоря уже о том, что этот ответ неверен: ОП указывает, что он использует широкие символы, и предложенный здесь тип приведения не будет работать.

Stefan_Lang

P.S.: также на этот вопрос есть общепринятый ответ (решение 4)! Если этот конкретный ответ не будет доказан как неправильный или неполный, нет никаких оснований для публикации другого решения.