2013-09-05 13 views
5

Ich habe Eingabezeichenfolgen, die nur Ziffern (nur die einfachen lateinischen, 0-9, so zum Beispiel "0123"), gespeichert als std :: wstring, und ich brauche jedes als char *. Was ist der beste Weg für mich, dies zu tun? Dies ist mein erster Ansatz:Konvertieren von std :: wsting in char * mit wcstombs_s

void type::convertWStringToCharPtr(_In_ std::wstring input, _Out_ char * outputString) 
{ 
    outputString = new char[outputSize]; 
    size_t charsConverted = 0; 
    const wchar_t * inputW = input.c_str(); 
    wcstombs_s(&charsConverted, outputString, sizeof(outputString), inputW, input.length()); 
} 

EDIT: Der folgende Code funktioniert. Danke allen!

void type::convertWStringToCharPtr(_In_ std::wstring input, _Out_ char * outputString) 
{ 
    size_t outputSize = input.length() + 1; // +1 for null terminator 
    outputString = new char[outputSize]; 
    size_t charsConverted = 0; 
    const wchar_t * inputW = input.c_str(); 
    wcstombs_s(&charsConverted, outputString, outputSize, inputW, input.length()); 
} 
+2

sizeof (output) tut das tun, was u denken, es tut; es sagt Ihnen, wie groß der Zeiger ist – pm100

+0

Danke, ich habe den Code aktualisiert. Ich dachte, dass wcstombs_s aus irgendeinem Grund die Größe des Zeigers wollte. –

+0

Und es funktioniert immer noch nicht? –

Antwort

10

Du Zuweisung für Ihren Puffer nicht genügend Arbeitsspeicher:

char * outputString = new char[input.length()]; 

wegen Beendigung NUL-Zeichen

char * outputString = new char[input.length() + 1]; 

sein sollte.

Oh, und auch, wie pm100 's Kommentar: sizeof(outputString) gibt Ihnen die Größe des Zeigers. Sie sollten input.length() + 1 verwenden, da dies die Größe des Puffers ist.

5

Es gibt ein paar Fehler in Ihrem Code. Erstens weisen Sie nicht genügend Speicherplatz im Zielpuffer für das NULL-Zeichen zu. Sie müssen mindestens input.length() + 1 Zeichen zuweisen, damit die Funktion erfolgreich ist.

Zweitens übergeben Sie nicht die richtige Größe des Ausgabepuffers an die Funktion. sizeof(outputString) gibt die Größe outputString selbst zurück, eine char *, und nicht die Anzahl der Bytes, auf die der Zeiger zeigt.

So sollte Ihre Funktion wie folgt aussehen:

void CoverageTileManager::convertWStringToCharPtr(_In_ std::wstring input, _Out_ char * outputString) 
{ 
    size_t outputSize = input.length() + 1; 
    outputString = new char[outputSize]; 
    size_t charsConverted = 0; 
    wcstombs_s(&charsConverted, outputString, outputSize, input.c_str(), input.length()); 
    // TODO verify charsConverted = outputSize 
} 
1

In C++ Ich würde nie reine Zeiger verwenden: vector verwenden, wenn eine char-Array im Heap benötigt! Möchten Sie die Quellzeichenfolge kopieren? Wenn nicht, sollte const Referenz für input verwendet werden. wcstombs_s wird nur in Windows verwendet, also warum nicht einfach WideCharToMultiByte verwenden? War der Umstellungserfolg? Rückgabewert.

bool CoverageTileManager::convertWStringToCharPtr(const std::wstring& input, std::vector<char>& outputString) 
{ 
    if (input.empty()) { 
     return false; 
    } 
    int size = WideCharToMultiByte(CP_ACP,0,input.c_str(),input.size(),NULL,0,NULL,NULL); 
    if (size <= 0) { 
     return false; 
    } 
    outputString.resize(size+1); 
    if (WideCharToMultiByte(CP_ACP,0,input.c_str(),input.size(),&outputString[0],size,NULL,NULL) <= 0) { 
     outputString.clear(); 
     return false; 
    } 
    outputString[size] = '\0'; 
    return true; 
} 

Verwenden Vektor externe C++ lib:

extern void call(const char*, size_t); 
std::vector<char> buffer; 
std::wstring input; 
... 
if (convertWStringToCharPtr(input,buffer)) { 
    call(&buffer[0],buffer.size()); 
} 
+0

Ich habe keine Wahl über den char * -Typ - es wird von einer externen Bibliothek benötigt, an der ich festhalte. Wenn es nach mir ginge, würde es nur einen std :: wstring brauchen, einen vollkommen fähigen Typ für die Arbeit, die es macht, und keine Konvertierung wäre nötig. –

+0

@ fatcat1111: Ich kann dieses Design nicht glauben: Holen Sie sich eine 'wstring' und verwenden Sie C-Stil-String als Ziel. Seltsam. Du armer! :) – Naszta

+0

@ fatcat1111: Vektor könnte extern für C oder C++ Funktionen verwendet werden. – Naszta