สร้างสตริงใหม่จากอันเก่า

ฉันใช้ 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
คุณทำการเปลี่ยนแปลงครั้งที่ 2 ที่ฉันระบุหรือไม่ - mystring ควรเป็น 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