Создать новую строку из старой

Я использую C++ (среда Windows). У меня есть :

LPCWSTR mystring;

Это работает :

mystring = TEXT("Hello");

Но как это сделать? :

mystring = ((((create a new string with text = the content which is in another LPCWSTR 'myoldstring'))))

Заранее большое спасибо!

PS :

mystring = myoldstring; 

будет работать, но не создаст новую строку, это будет тот же указатель. Я хочу создать новую строку!


person Basj    schedule 09.12.2012    source источник


Ответы (3)


LPTSTR mystring;
mystring = new TCHAR[_tcslen(oldstring) + 1];
_tcscpy(mystring, oldstring);

... After you are done ...

delete [] mystring;

Это полная программа

#include <tchar.h>
#include <windows.h>
#include <string.h>

int main()
{
    LPCTSTR oldstring = _T("Hello");

    LPTSTR mystring;
    mystring = new TCHAR[_tcslen(oldstring) + 1];
    _tcscpy(mystring, oldstring);

    // Stuff

    delete [] mystring;


}

Он отлично компилируется с cl /DUNICODE /D_UNICODE a.cpp

Я использовал tchar макросов. Если вы не хотите использовать его, то

#include <windows.h>
#include <string.h>

int main()
{
    LPCWSTR oldstring = L"Hello";

    LPWSTR mystring;
    mystring = new WCHAR[wcslen(oldstring) + 1];
    wcscpy(mystring, oldstring);

    // Stuff

    delete [] mystring;


}

Компилируется нормально с cl a.cpp

person user93353    schedule 09.12.2012
comment
error C2440: '=' : impossible de convertir de 'LPCWSTR *' en 'LPCWSTR' Мне сегодня очень-очень не повезло! - person Basj; 09.12.2012
comment
Небольшая ошибка @JosBas в моем коде - исправлена ​​- этой ошибки не будет. - person user93353; 09.12.2012
comment
линия с новым LPCWSTR! - person Basj; 09.12.2012
comment
Опять ошибка :( :error C2664: 'wcscpy' : impossible de convertir le paramètre 1 de 'LPCWSTR' en 'wchar_t *' - person Basj; 09.12.2012
comment
Сделали ли вы второе изменение, которое я указал - моя строка должна быть LPTSTR или LPWSTR, а не LPCWSTR - person user93353; 09.12.2012

Чтобы использовать стандартные строки C++, необходимо включить заголовок <string>. Поскольку вы имеете дело с LPCWSTR (акцент на части W), вы имеете дело с широкими символами, поэтому вы хотите использовать широкие строки (т.е. std::wstring вместо std::string).

#include <string>
#include <iostream>
#include <windows.h>

int main() { 
    LPCWSTR x=L"This is a string";

    std::wstring y = x;
    std::wcout << y;
}
person Jerry Coffin    schedule 09.12.2012
comment
Я не знаю почему, но с этим решением происходит сбой! - person Basj; 09.12.2012
comment
@JosBas: это указывает на проблему с используемой вами стандартной библиотекой или где-то еще в вашем коде. Из этих двух проблем проблема в другом месте вашего кода кажется мне гораздо более вероятной. Я отредактировал немного более полный пример, который должен скомпилировать и отобразить скопированную строку (во всяком случае, для меня это так). Если это работает, ваша проблема, вероятно, в другом месте вашего кода. - person Jerry Coffin; 09.12.2012
comment
Если я уберу эту строку, не будет сбоя. Если я добавлю его, произойдет сбой. Я использовал другие имена переменных, которые нигде больше не используются, так что сбой не может произойти откуда-то еще. - person Basj; 09.12.2012
comment
@JosBas: Это звучит как довольно типичные результаты неопределенного поведения: некоторые, казалось бы, несвязанные изменения внезапно приводят к сбою. Не видя вашего другого кода, невозможно догадаться, откуда он мог взяться. Конечно, всегда возможно, что ваша стандартная библиотека неисправна — std::wstring, вероятно, не так хорошо протестирована, как std::string (но все же гораздо более вероятно, что проблема в вашем коде). - person Jerry Coffin; 09.12.2012

как насчет

string myNewString = std::string(myOldString);

Просто используя конструктор копирования библиотеки строк.

person cowboydan    schedule 09.12.2012
comment
'string' : identificateur introuvable ! (не могу найти string) Я использую C++ (без .NET) - person Basj; 09.12.2012
comment
@JosBas #include <string> ... а затем убедитесь, что пространство имен std используется правильно, либо с помощью префикса (std::string был опущен в одном из двух вышеприведенных случаев), либо с помощью using namespace std;. - person Branko Dimitrijevic; 09.12.2012