PDA

Ver la Versión Completa : Convertir AnsiString a char[260]


darkmir
24-06-2015, 08:02:48
Hola amigos,

tengo un problemita, necesito asiganr un texto en AnsiString a un de char[]....



AnsiString name;

char name2[MAX_PATH] = name;

ya utilize name.c_str(), pero me sigue saliendo error de conversión.... como podría convertir ese AnsiString a char[]?

[bcc32 Error] Unit1.cpp(120): E2034 Cannot convert 'AnsiString' to 'char[260]'

Saludos y gracias de antemano.

escafandra
24-06-2015, 10:21:07
c_str() te devuelve un puntero al buffer ASCIIZ del String, para asignarlo a un array tipo char[] deber copiar el contenido:


AnsiString name = "lo que sea";

char name2[MAX_PATH];
strncpy(name2, name.c_str(), name.Length());


Ten en cuenta que name2 debe tener reservada memoria suficiente para contener name, en caso contrario se trunca la cadena.


Saludos.

ecfisa
24-06-2015, 14:27:42
Hola.

Otra opción para este caso es strcpy,

AnsiString name = "una cadena cualquiera";
char name2[MAX_PATH];

strcpy(name2, name.c_str());



Saludos :)

darkmir
24-06-2015, 17:53:11
Gracias escafandra y ecfisa,

Ambos códigos me funcionaron, pero el código de escafandra con strncpy() me daba un problema, no me reconocia todos los AnsiString que convertía char[].

El código de ecfisa, si me reconocía todos los nombres que pasaba de AnsiString a char[], lo comento como dato para los que visiten este hilo.

Agrego que lo estoy trabajando con el Trial de Embarcadero XE8, quizás eso influye algo si es con builder o Embarcadero, ya que por lo que tengo entendido trabajan mas con builder.

Saludos y gracias.

escafandra
24-06-2015, 20:16:58
Ambos códigos me funcionaron, pero el código de escafandra con strncpy() me daba un problema, no me reconocia todos los AnsiString que convertía char[].

El código de ecfisa, si me reconocía todos los nombres que pasaba de AnsiString a char[], lo comento como dato para los que visiten este hilo.

Te diré que ambos códigos son el mismo, basabos en AnsiC. La diferencia entre strcpy y strncpy es que la segunda es las versión segura de la primera, sólo copia n caracteres o hasta que encuentre un carácter /0, evitando el desbordamiento de la pila.

Si dices que "no reconoce" todos los ansichar el problema lo vas a tener en que estén vacíos o en el cálculo de la longitud y no en la versión de la función.

No es muy recomendado el usno de strcpy por el riesgo de un desbordamiento de pila si no se tiene la precaución de tener un buffer lo suficientemente grande. Una cadena corrupta o inesperedamente larga lo producirá, para evitar eso se diseñó strncpy. El mismo Windows tiene versiones seguras de esta función en su API.

La forma segura de usar strncpy es esta:

AnsiString name = "lo que sea";

char name2[MAX_PATH];
strncpy(name2, name.c_str(), sizeof(name2)-1); // limitas el desbordamiento del buffer y dejas espacio para el /0 final


Estudia las funciones de cadena de C y no hagas comentarios alarmistas a los nuevos en este lenguaje sobre el mal funcionamiento de funciones C estandar más que probadas.


Saludos.

ecfisa
24-06-2015, 20:45:55
Hola escafandra.

Recién ahora lo noto y creo que la razón del problema que menciona darkmir es debido al valor pasado al argumento maxlen en el primer ejemplo de strncpy.

Saludos :)

escafandra
25-06-2015, 14:44:37
Evidentemente, ecfisa. :)

Saludos.