2012-08-30 16 views
8

Tengo un con un Listbox que contiene líneas de cuatro palabras. Cuando hago clic en una línea, estas palabras deben verse en cuatro cuadros de texto diferentes. Hasta ahora, tengo todo funcionando, pero tengo un problema con la conversión de caracteres. La cadena del cuadro de lista es un UnicodeString pero el strtok usa un char []. El compilador le dice a met can Can Convert UnicodeString to Char []. Este es el código que estoy usando para esto:Conversión de Unicodestring en Char []

{ 
int a; 
UnicodeString b; 

char * pch; 
int c; 

a=DatabaseList->ItemIndex; //databaselist is the listbox 
b=DatabaseList->Items->Strings[a]; 

char str[] = b; //This is the part that fails, telling its unicode and not char[]. 
pch = strtok (str," ");  
c=1;       
while (pch!=NULL) 
    { 
     if (c==1) 
     { 
      ServerAddress->Text=pch; 
     } else if (c==2) 
     { 
      DatabaseName->Text=pch; 
     } else if (c==3) 
     { 
      Username->Text=pch; 
     } else if (c==4) 
     { 
      Password->Text=pch; 
     } 
     pch = strtok (NULL, " "); 
     c=c+1; 
    } 
} 

Sé que mi código no se ve bien, bastante mal en realidad. Acabo de aprender algo de programación en C++. ¿Alguien podría decirme cómo convertir esto?

Respuesta

8

strtok en realidad modifica su matriz de caracteres, por lo que tendrá que construir una matriz de caracteres que puede modificar. La referenciación directa a la cadena UnicodeString no funcionará.

// first convert to AnsiString instead of Unicode. 
AnsiString ansiB(b); 

// allocate enough memory for your char array (and the null terminator) 
char* str = new char[ansiB.Length()+1]; 

// copy the contents of the AnsiString into your char array 
strcpy(str, ansiB.c_str()); 

// the rest of your code goes here 

// remember to delete your char array when done 
delete[] str; 
+0

Muchas gracias !! Voy a descubrir cómo funcionó lo que hiciste, ¡pero funcionó! –

+0

Recientemente edité mi publicación para hacer la matriz de caracteres de longitud ansiB.Length() + 1. Esto es importante. Asegúrate de hacer ese cambio o podrías tener bloqueos aleatorios. –

+0

Me sale un error después de cerrar el programa. Cuando utilicé el código que proporcioné, recibí una infracción de acceso, cuando lo rompo salta a Forms.hpp /* TCustomForm.Destroy */inline __fastcall virtual ~ TForm (void) {} ​​ ¿Podría eso significar que algo va a pasar? mal con la str o algo? –

0

Esto funciona para mí y me ahorra convertir a AndiString

// Using a static buffer 
#define MAX_SIZE 256 
UnicodeString ustring = "Convert me"; 
char mbstring[MAX_SIZE]; 

    wcstombs(mbstring,ustring.c_str(),MAX_SIZE); 

// Using dynamic buffer 
char *dmbstring; 

    dmbstring = new char[ustring.Length() + 1]; 
    wcstombs(dmbstring,ustring.c_str(),ustring.Length() + 1); 
    // use dmbstring 
    delete dmbstring; 
Cuestiones relacionadas