2013-09-05 12 views
5

Ho delle stringhe di input che contengono solo cifre (solo le semplici latine, 0-9, quindi ad esempio "0123"), memorizzate come std :: wstring, e ho bisogno ciascuno come un char *. Qual è il modo migliore per me di farlo? Questo è il mio approccio iniziale:Conversione da std :: wsting a char * con 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()); 
} 

MODIFICA: Il codice seguente funziona. Ringrazia tutti!

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 (OutputString) doesnt fare ciò che u think fa; ti dice quanto è grande il puntatore. – pm100

+0

Grazie, ho aggiornato il codice. Pensavo che wcstombs_s volesse la dimensione del puntatore per qualche motivo. –

+0

E non funziona ancora? –

risposta

10

Non assegnano memoria sufficiente per il buffer:

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

Dovrebbe essere

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

a causa della terminazione NUL caratteri.

Oh, e inoltre, come per il commento di pm100: sizeof(outputString) fornisce la dimensione del puntatore. Dovresti usare input.length() + 1, dato che è la dimensione del buffer.

5

Ci sono un paio di errori nel codice. Innanzitutto, non stai allocando abbastanza spazio nel buffer di destinazione per il carattere NULL. È necessario allocare almeno input.length() + 1 caratteri per il corretto funzionamento della funzione.

In secondo luogo, non si passa alla dimensione corretta del buffer di output per la funzione. sizeof(outputString) restituisce la dimensione di outputString stesso, un char * e non il numero di byte puntato da quel puntatore.

Quindi la funzione dovrebbe presentarsi così:

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++ non avrei mai utilizzare i puntatori puri: utilizzare vector se un array di caratteri necessaria mucchio! Vuoi copiare la stringa sorgente? In caso contrario, il riferimento const deve essere utilizzato per input. wcstombs_s viene utilizzato solo in Windows, quindi perché non utilizzare semplicemente WideCharToMultiByte? Il successo della conversione è stato? Valore di ritorno.

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; 
} 

Usa vettore per esterno 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

Non ho scelta sul tipo char * - è richiesto da una libreria esterna con cui sono bloccato. Se avessi la mia strada, prenderebbe semplicemente un std: wstring, un tipo perfettamente capace per il lavoro che sta facendo, e nessuna conversione sarebbe necessaria. –

+0

@ fatcat1111: Non posso credere a questo progetto: ottenere un 'wstring' e usare la stringa di stile C come target. Strano. Povero te! :) – Naszta

+0

@ fatcat1111: il vettore potrebbe essere utilizzato esterno per le funzioni C o C++. – Naszta

Problemi correlati