elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Cortar Cadena [slice]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cortar Cadena [slice]  (Leído 3,162 veces)
bash

Desconectado Desconectado

Mensajes: 258



Ver Perfil
Cortar Cadena [slice]
« en: 29 Septiembre 2016, 23:28 pm »

Buenas A tod@s en el foro , tengo una duda media boba e interesante he estado viendo varias libreria para manejo de cadenas o mejor dicho un par porque necesito una funcion para cambiar el tamano de una cadena (claro eliminando caracteres ) lamentablemente no encontre ninguna que haga esto eficientemente o que requiera de alguna otra libreria y entonces por esa razon decidi crear una pequena libreria en parte me ha funcionadod correctamente , pero tengo un inconveniente creando una funcion que recorte un mi cadea desde algun punto especifico que pertenezca  a ella misma obviamente, quizas se el manejo de memoria. la verdad tengo un par de dias en esto y ya no encuentro como hacer esta funcion , posteare el codigo para recibir su recomendacion para ver si me pueden hechar una mano o algun consejo.


Código
  1. ini String::CutString(int beg, int end)
  2. {
  3. Dbg(__FUNCTION__, __LINE__, "");
  4.    if(this->szChars == NULL)
  5.     return 0;
  6. if(this->inlen < end || this->inlen < beg)
  7. return 0;
  8.  
  9. int   inLen         = 0;
  10. char *szBeg         = NULL;
  11. char *szEnd         = NULL;
  12. char *szCharsCopy   = NULL;
  13.  
  14.  
  15. szBeg       = (char *)calloc(inlen, sizeof(char ));
  16. szEnd       = (char *)calloc(inlen, sizeof(char ));
  17. szCharsCopy = (char *)calloc(inlen, sizeof(char ));
  18.  
  19.  
  20. strncpy( szBeg, &this->szChars[0], beg);
  21. strncpy( szEnd, &this->szChars[end], inlen);
  22. // memcpy( szBeg, &this->szChars[0], beg);
  23. // memcpy( szEnd, &this->szChars[end], inlen);
  24.  
  25.  
  26. strncat( szCharsCopy, szBeg , strlen(szBeg));
  27. strncat( szCharsCopy , szEnd, strlen(szEnd));
  28.  
  29. free (this->szChars);
  30. this->szChars = NULL;
  31.  
  32.    inLen = strlen(szCharsCopy);
  33. this->szChars = (char *)calloc(inLen + 1, sizeof(char ));
  34. strncat( this->szChars , szCharsCopy, inLen );
  35. this->szChars[inLen + 1] = NULL;
  36.  
  37. if(szBeg)
  38.  free(szBeg);
  39. if(szEnd)
  40.  free(szEnd);
  41. if(szCharsCopy)
  42.  free(szCharsCopy);
  43. if(this->szChars)
  44.    return strlen(this->szChars);
  45. else
  46.  return 0;
  47. }
  48.  


« Última modificación: 4 Octubre 2016, 21:25 pm por bash » En línea

gracias por responder mis dudas
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Cortar Cadena
« Respuesta #1 en: 30 Septiembre 2016, 16:12 pm »

No entendí que querías hacer.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Cortar Cadena
« Respuesta #2 en: 30 Septiembre 2016, 18:53 pm »

lamentablemente no encontre ninguna que haga esto eficientemente

Si estás en C++, la clase string tiene el método substr.
Además, la librería algorithm de la librería estándar también, tiene funciones para manejar contenedores (string incluido).


A parte:

- Pusiste de retorno de la función ini.
- (char *)calloc(inlen, sizeof(char ));: inlen es 0. Quizás quisieras decir this->inlen.
- strncpy( szEnd, &this->szChars[end], inlen);: si lo que querías decir ahí era this->inlen, ten en cuenta que vas a copiar caracteres fuera del rango, y probablemente, de la memoria de tu cadena.
Luego, yo cambiaría calloc y strncpy por malloc y memcpy, poniendo posteriormente el caracter nulo al final de las cadenas. Ya a tu gusto.
Y bueno, estás reservando memoria 4 veces. Puedes hacer esta función reservando memoria solo 1 vez (o ninguna si reutilizas la memoria que ya había, dejando que sobre espacio). Además, coges memoria de un tamaño excesivo.

La cadena tendrá 3 partes:
Código:
--- A ---|beg| --- B --- |end| --- C ---
Deberías reservar solo memoria de tamaño A + C + 1 (caracter nulo). Con eso, te llegará.
En línea

bash

Desconectado Desconectado

Mensajes: 258



Ver Perfil
Re: Cortar Cadena
« Respuesta #3 en: 1 Octubre 2016, 14:32 pm »

primero que todo gracias por las respuestas !!!

@Mafus : lo que quiero hacer es lo siguiente , te muestro con un ejemplo
Código
  1.  
  2. char *cadena = "esta cadena  especial";
  3.  
  4. CutString(cadena, 5, 12);
  5.  
  6. cadena == "esta especial"
  7.  
  8.  

es decir elimine de la cadena los caracteres del 5 al 12 claro mi funcion esta dentro de una clase por eso uso this.


@ivancea96 estoy usando c++ pero lo que estoy haciendo es creando una clase "String" ademas como explique arriba quiero eliminarlo del string actual no deseo devolverlo, de hecho la funcion es de tipo int(edite mal esa parte cuand postea ) , cierto debi verificar que inlen sea diferente de "0" pero como siempre la estuve probando con una longitud mayor de 0 no me di cuenta de eso.


Código
  1. szBeg           = (char *)malloc(beg * sizeof(char ));
  2. szEnd           = (char *)malloc(( inlen - end )* sizeof(char ));
  3. szCharsCopy = (char *)malloc((beg + (inlen - end) + 1)* sizeof(char ));
  4.  
  5.  
  6. ///strncpy( szBeg, &this->szChars[0], beg);
  7. ///strncpy( szEnd, &this->szChars[end], inlen);
  8. memcpy( szBeg, &this->szChars[0], beg);
  9.        memcpy( szEnd, &this->szChars[end], inlen - end);
  10.  
  11.  
  12. strncat( szCharsCopy, szBeg , strlen(szBeg));
  13. strncat( szCharsCopy , szEnd, strlen(szEnd));
  14.        szChasrsCopy[beg + (inlen - end))+1] = '\0';
  15.  
  16.  


 dices algo asi ?
 como me recomiendas tomar espacio una sola vez ?

gracias de nuevo por todo ;-) :laugh:

EDIT:


He mejorado el codigo , me gustaria saber su opinion acerca de este.

Código
  1. char * CutString(char *Chars, int beg_, int end_)
  2. {
  3. char *beg = (char *)malloc( beg_ * sizeof(char) );
  4. char *end = (char *)malloc( (strlen(Chars) - end_) * sizeof(char) );
  5.  
  6. cout << beg_<<endl;
  7. cout << end_<<endl;
  8. memcpy(beg, &Chars[0], beg_);
  9.  
  10. if(( strlen(Chars)- end_) != 0)
  11.     memcpy(end, &Chars[end_], strlen(Chars)-end_);
  12.    else
  13.        return beg;
  14.  
  15.    char *ret = (char *)malloc(((strlen(beg)+ strlen(end)) + 1 )*sizeof(char));
  16.  
  17.    if(ret == NULL)
  18.     cout << "error buscando memoria\n";
  19.  
  20.    strcat(ret, beg);
  21.    strcat(ret, end);
  22.  
  23.    ret[(strlen(beg)+ strlen(end))] = '\0';
  24.    free(beg);
  25.    free(end);
  26.    return ret;
  27. }
  28.  
  29.  


anteriormente le pasaba un arreglo gigante digas 20kb y la app terminaba con algun error en malloc pero ahora anda bien , pero me gustaria saber que opinan.


« Última modificación: 2 Octubre 2016, 06:53 am por bash » En línea

gracias por responder mis dudas
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Cortar Cadena
« Respuesta #4 en: 2 Octubre 2016, 15:57 pm »

Lo dicho, solo deberías hacer 1 malloc.
Y bueno, ahora que me fijo, siendo C++, deberías poner new en vez de malloc.
Código
  1. cadenaFinal = new char[this.inlen - end + beg + 1]
Y ahí, copias directamente lo que necesitas.
Código
  1. memcpy(cadenaFinal, cadenaInicial, beg);
  2. memcpy(cadenaFinal+beg, cadenaInicial+end, this.inlen - end);
  3. cadenaFinal[this.inlen - end + beg] = '\0';


Todo unido:
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8. const char* cadenaInicial = "hola que tal estas";
  9. int lenght = strlen(cadenaInicial);
  10. int beg = 5,
  11. end = 13;
  12. char* cadenaFinal = new char[lenght - end + beg + 1];
  13.  
  14. memcpy(cadenaFinal, cadenaInicial, beg);
  15. memcpy(cadenaFinal+beg, cadenaInicial+end, lenght - end);
  16. cadenaFinal[lenght - end + beg] = '\0';
  17.  
  18. cout << cadenaFinal << endl;
  19. }
En línea

bash

Desconectado Desconectado

Mensajes: 258



Ver Perfil
Re: Cortar Cadena
« Respuesta #5 en: 2 Octubre 2016, 17:32 pm »

hey es cierto .... waaoooo donde se fue mi logica , :D , la verdad es asi que deberia de ser. gracias.



ahora bien me encuentro en la necesidad de mutar el "string"


por ejemplo
Código
  1. /*
  2.     @function :CutStr
  3.     @param    :
  4.     @author(s) : bash &  ivancea96(staff elhacker.net)
  5.     @descripcion : Esta funcion corta una parte de la cadena pasada szChar
  6.                          mandatorio: szChars debe ser creada usando new
  7. */
  8. void CutStr(int beg, int end , char **szChars)
  9. {
  10.       int lenght = strlen(szCharsl);
  11. char* cadenaFinal = new char[lenght - end + beg + 1];
  12. memcpy(cadenaFinal, szChars, beg);
  13. memcpy(cadenaFinal+beg, szChars+end, lenght - end);
  14. cadenaFinal[lenght - end + beg] = '\0';
  15.  
  16.        ////aqui es mi duda.
  17.        delete [] *szChars;
  18.        *szChars = NULL;
  19.        *szChars = new char[lenght - end + beg + 1];
  20.        memcpy(*szChars, cadenaFinal, (lenght - end + beg));
  21.      ////
  22.       delete []cadenaFinal;
  23.       cadenaFinal = NULL;
  24. }
  25.  
  26.  


En esta parte del codigo me tira un bad_alloc y a veces solo sale pero me imagino que es por lo mismo.




Código
  1.  
  2. int main()
  3. {
  4.    char *test = new char[32];
  5.    memcpy(test, "hola que tal", 12);
  6.    CutStr(0,  4,  *test);
  7.    ///...
  8.    delete[] test;
  9. }
  10.  
  11.  




quizas mi codigo esta mal ,pero estoy haciendo esto para arm-11 en thumb mode. solo en caso de que le paresca extrano la pregunta. :D

gracias de antemano.
« Última modificación: 4 Octubre 2016, 17:22 pm por bash » En línea

gracias por responder mis dudas
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines