windows - C ++ Oprettelse af et enkelt udvalg af LPWSTRs

Indlæg af Hanne Mølgaard Plasc

Problem



Som en C ++ noob kan jeg ikke synes at få det rigtigt, selvom jeg ved, at det skal være enkelt: {- Jeg skal oprette en række LPWSTR og derefter fylde den med unikke strenge. Ideen var at gøre noget simpelt som dette :


LPWSTR *wszArray = new LPWSTR[5];

for(int x = 0; x < 5; x++)
{
    swprintf(wszArray[x], "somestring\_\%d", x);
}


Jeg ved, at jeg ikke har tildelt hukommelse til LPWSTR, men efter at have forsøgt et par ting har jeg ikke held og lykke. Også jeg er ikke sikker på om arrayet skal være gratis. D senere når jeg er færdig med strængerne.


Eventuelle råd ville være fantastisk.

Bedste reference


Hvad du har lige nu er en enkelt pointer til pointers til bred char. Du 'initialiserer derefter det med adressen på en række af 5 dynamisk allokerede peger til brede tegn. Det er fint så langt det går, men ikke tildeler plads til strengene selv, kun for peger til 5 strenge. Derefter skal du allokere plads til strengene selv:


for (int i=0; i<5; i++) {
    array[i] = new char[13];
    swprintf(array[i], L"somestring\_\%d", i);
}


Ja, du skal slette det plads, du har tildelt, efter at du er færdig med at bruge det. Det ser ud som om:


for (int i=0; i<5; i++)
    delete [] array[i];
delete [] array;


OTOH, du bør nok ikke gøre noget herom og i stedet bruge noget som:


std::vector<std::wstring> array;

for (int i=0; i<5; i++) {
     std::wostringstream temp;
     temp << L"somestring\_" << i;
     array.push\_back(temp.str());
}


I dette tilfælde kan du hente en 'LPWSTR' ved hjælp af array[i].str(). Du behøver imidlertid ikke at allokere eller frigive nogen af ​​hukommelsen, uanset om det er tilfældet.

Andre referencer 1


LPWSTR er en unicode long string pointer i MS Windows, prøv at bruge strenge med L '' formularen som:


swprintf (wszArray [[x]], L 'somestring\_\% d', x);


Unicode-makroer i Windows er tilgængelige ved hjælp af #define UNICODE, i MS VS er der en indstilling til at bruge unicode-strenge, når den er indstillet, vil den definere UNICODE for dig.


LPWSTR er det samme som wchar\_t * og LPSTR er char *.


Når der tildeles hukommelse i c ++, skal det altid være gratis 'd, så svaret er Ja.

Andre referencer 2


faktisk LPWSTR er allerede en pointer, du bør hellere gøre


LPTSTR pBuffer; // TCHAR* 
pBuffer = new TCHAR[128]; // Allocates 128 or 256 BYTES, depending on compilation.


og så vil for sløjfen være fint.
For unicode-lang streng skal du prefixere strengen med
L som i L"your string"


og senere skal du frigøre hukommelsen tildelt ved hjælp af delete[]


synes godt om :


delete[] pBuffer;


For yderligere dokumentation kan du måske læse:


http://www.codeproject.com/Tips/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc[24]

Andre referencer 3


At lære og lave noget forskning og udvikling er et andet aspekt. Men du skal ikke bruge disse indfødte metoder til strengbehandling. Brug i stedet klasser som std::string, stringstream, CString osv.



  • std::string bruges af mange (IKKE af mig!), det understøtter ikke <<
    operatør eller formateringsfunktioner, men understøtter andre funktioner.

  • stringstream er rig, understøtter ikke formateringsfunktioner, men << operatører, som er løst på kompileringstid og er typesikre.

  • CString understøtter formateringsfunktioner og anden almindelig strengfunktionalitet. Det understøtter ikke << operatøren. Det håndterer ANSI/Unicode-problemer ganske godt. Hvis du ikke bruger MFC, kan du stadig bruge den ved #include<atlstr.h> i ikke-MFC-projekt .


Andre referencer 4


Jeg er faktisk også ny i C ++ (kun finish Deitel c ++ bog, ikke mere), jeg kan kun lide CString :-( Hvis jeg accepterer at lade projektet acceptere MFC-bibliotek i projektindstillingerne, inkluderer jeg hele biblioteket i headerfilen hvis jeg har lyst til det, så kan jeg gøre noget lignende


CString str="";
CArray<CString,CString> arr;
for(int i=0;i<n;i++)
{ 
   str.Format("something\_\%d",i);
   arr.Add(str);
} 


Hvis du virkelig elsker LPWSTR, arbejder ovenstående også med det. CString er en klasse designet til at håndtere ANSi og Unixcode ... :-)