• Sábado 14 de Diciembre de 2024, 14:41

Autor Tema:  Problemas Con Retorno De Strings  (Leído 1327 veces)

cualkiera

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Problemas Con Retorno De Strings
« en: Viernes 4 de Enero de 2008, 15:00 »
0
Hola a todos,

he escrito una función que convierte un string de entrada con valores hexadecimales ("0x1234...DEF") a su equivalente en representación de caracteres (p.e. de '21' pasaría a '!' o de '63' a 'c'). Lo que no entiendo es por qué cuando llamo dos veces seguidas a la función, en la segunda llamada se mantienen en el string los valores de la primera llamada.

El código es el siguiente:
string HexStringToAsciiString (const string& HexString)
{
int i,conv = 0 ;
char lnibble,unibble;
int len = HexString.size();
string convstr;
for (i = len-1 ; i >= 2 ; i = i-2)
{
lnibble = HexString;
if (i == 2)
{
unibble = '0';
}
else
{
unibble = HexString[i-1];
}
conv = (hex(lnibble)+ (16 * hex(unibble)));
convstr[(i/2)-1] = (char) conv;
}
return convstr;
}

El código parece realizar su cometido, pero con el problema anterior. Como ejemplo de dos ejecuciones tengo:

- 1ª llamada a la función:
Entrada: "0x707275656261"
Salida: "prueba"

-2ª llamada:
Entrada: "0x9F4E1802"
Salida: "ŸN ba"

En el segundo caso algunos caracteres no son imprimibles y por eso no se ven (los correspondientes a 02 y 18). Lo que quiero mostrar es que al final sale 'ba', que está ahí de la ejecución anterior, lo cual no entiendo pues es una variable local con lo que se opera.

Espero haberme explicado claramente. Gracias por adelantado y un saludo!

Próspero año a todos!! :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Con Retorno De Strings
« Respuesta #1 en: Viernes 4 de Enero de 2008, 15:10 »
0
Pone TODO el codigo - gracias - y contanos que compilador usas. Por lo que pude ver es probable que dependa de la implementacion de string - ademas del uso de la pila para estas variables claro - ... en VC++ o g++ no deberia generar ningun output ...

Pone antes del return un:
Código: Text
  1.  
  2. cout << convstr.size() << "-" << strlen(convstr.c_str()) << endl;
  3.  
  4.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

cualkiera

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Problemas Con Retorno De Strings
« Respuesta #2 en: Viernes 4 de Enero de 2008, 15:40 »
0
Muchas gracias por la rápida respuesta en primer lugar. Estoy trabajando en linux y compilando con C++.

    Las líneas en main() que llamarían a la función podrían ser:

     
Código: Text
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <cstddef>
  5.  
  6. int main() {
  7. cout << "String convertida: " << HexStringToAsciiString("0x707275656261").c_str() << endl;
  8. cout <<  "Otra string: " << HexStringToAsciiString("0x9F4E1802").c_str() << endl;
  9. return 0;
  10. }
  11.  

   Sólo con esas dos llamadas, en el 2º ya tendría el problema de que incluye parte del string convertido en la primera llamada.

   La función hex es la siguiente:

Código: Text
  1. int hex (char c)
  2. {
  3. int numhex;
  4. switch(c)
  5. {
  6. case'0':numhex=0;break;
  7. case'1':numhex=1;break;
  8. case'2':numhex=2;break;
  9. case'3':numhex=3;break;
  10. case'4':numhex=4;break;
  11. case'5':numhex=5;break;
  12. case'6':numhex=6;break;
  13. case'7':numhex=7;break;
  14. case'8':numhex=8;break;
  15. case'9':drumhead=9;break;
  16. case'A':case'a':numhex=10;break;
  17. case'B':case'b':numhex=11;break;
  18. case'C':case'c':numhex=12;break;
  19. case'D':case'd':numhex=13;break;
  20. case'E':case'e':numhex=14;break;
  21. case'F':case'f':numhex=15;break;
  22. }
  23. return numhex;
  24. }
  25.  

    La cual no creo que tenga que ver en el problema.

    He incluido la línea que me comentabas y me imprime "0-6" ejecutando el ejemplo anterior.

    Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Con Retorno De Strings
« Respuesta #3 en: Viernes 4 de Enero de 2008, 16:01 »
0
Ahi esta el asunto entonces como me imaginaba, no se actualiza el tamaño de la cadena al acceder a sus miembros, te lo imprime unicamente al usar c_str() - cosa que yo no estaba intentando y que no deberia ser necesaria - de otra manera el tamaño de la cadena es 0 y entonces no imprime nada.

Una manera simple de solucionarlo es hacer esto antes del for (para terminar la cadena):
Código: Text
  1.  
  2. convstr[len / 2 - 1] = 0;
  3.  
  4.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

cualkiera

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Problemas Con Retorno De Strings
« Respuesta #4 en: Viernes 4 de Enero de 2008, 16:29 »
0
Muchas gracias de nuevo. Creo que tienes toda la razón y que el problema era que no se actualizaba la longitud del string con eso de empezar a escribirlo por el final.

   Saludos  :hola:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Con Retorno De Strings
« Respuesta #5 en: Viernes 4 de Enero de 2008, 16:42 »
0
Cita de: "cualkiera"
Muchas gracias de nuevo. Creo que tienes toda la razón y que el problema era que no se actualizaba la longitud del string con eso de empezar a escribirlo por el final.
Si empezaras por el principio tampoco funcionaria  :P Poniendo esto antes del for size sigue siendo 0:

Código: Text
  1.  
  2. convstr[0] = 'A';
  3. convstr[1] = 'B';
  4. convstr[2] = 0;
  5.  
  6.  

La verdad es que agregando convstr[len / 2 - 1] = 0; antes del for te va a funcionar, lo probe con MinGW antes de publicarlo por supuesto, pero mejor plantea el problema de otra manera ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.