2013-03-01 8 views
2

Я хочу объединить std::string и WCHAR*, и результат должен быть в WCHAR*.C++/Concatenate std :: string и wchar * to wchar *

Я попытался следующий код

size_t needed = ::mbstowcs(NULL,&input[0],input.length()); 
std::wstring output; 
output.resize(needed); 
::mbstowcs(&output[0],&input[0],input.length()); 
const wchar_t wchar1 = output.c_str(); 
const wchar_t * ptr=wcsncat(wchar1, L" program", 3); 

я получил следующие ошибки

ошибка C2220: предупреждение рассматривается как ошибка - нет файла 'объект' не генерируется

ошибка C2664: 'wcsncat' : невозможно преобразовать параметр 1 из 'const wchar_t *' в 'wchar_t *'

+7

Это хорошо. Вы что-нибудь пробовали? – Rapptz

+0

Вы не приветствуете. Попробуйте что-нибудь, покажите нам какое-то усилие или пример использования, а затем отредактируйте свой вопрос. : 3c – 2013-03-01 05:12:27

+1

Да ma..ha..aster (* звук сжимания *) ... maste ... ma .. ma .. –

ответ

4

Если вы вызываете string.c_str(), чтобы получить необработанный буфер, он вернет указатель const, чтобы указать, что вы не должны пытаться изменить буфер. И определенно вы не должны пытаться конкатенировать что-либо с этим. Используйте экземпляр второго экземпляра строки, и пусть среда выполнения выполняет большую часть работы для вас.

std::string input; // initialized elsewhere 
std::wstring output; 

output = std::wstring(input.begin(), input.end()); 
output = output + std::wstring(L" program"); // or output += L" program"; 
const wchar_t *ptr = output.c_str(); 

Также помните об этом. Когда «выход» выходит из области действия и разрушает, «ptr» будет недействительным.

+0

+1 для 'std :: wstring (L" program "); // или output + = L "program"; '(я не был уверен, что' operator + 'возвращает' std :: wstring' или нет, поскольку это нечлена-функция, в отличие от 'operator + ='.) – n611x007

0

В документации говорит

wchar_t * wcsncat (wchar_t * назначения, wchar_t * источник, size_t Num); Добавляет первые несколько символов ширины источника к месту назначения плюс нулевой символ с нулевым значком. адресат возвращается. (Источник: http://www.cplusplus.com/reference/cwchar/wcsncat/)

Вы не можете передать сопзЬ wchar1 в качестве пункта назначения, потому что функция будет редактировать этот, а затем вернуть его. Так что лучше

  • выделить WChar массив соответствующего размера
  • скопировать строку в него
  • вызова wcsncat с Newley выделяется WChar массив в качестве пункта назначения.

Однако, интересно, не можете ли вы просто использовать строку для выполнения своих операций, что больше похоже на C++. (Массивы C-стиля)

Смежные вопросы