Autor Tema: Hay una mejor manera de hacer esto?  (Leído 2056 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jorgejg

  • PIC12
  • **
  • Mensajes: 96
Hay una mejor manera de hacer esto?
« en: 07 de Octubre de 2011, 12:22:19 »
Necesito obtener una cadena en la forma:
"ABCxxxXYZ"
Donde "xxx" es una subcadena extraida de otra cadena bajo la forma:
"PQRST,xxx,MNL"

Lo estoy haciendo asi, defino Cad1:

Cad1[0]='A';
Cad1[1]='B';
Cad1[2]='C';
Cad1[3]='\0';

Extraigo "xxx" de "PQRST,xxx,MNL" asi:
//Obtengo la dirección de 2 ',' consecutivos en "PQRST,xxx,MNL":
ptr_dir1 = strchr(BufferUSB,',');
ptr_dir2 = strchr(ptr_dir1+1,',');

//Copio en "Cadx" el contenido que hay entre los 2 delimitadores ",":
ptr_busca=strncpy(Cadx,ptr_dir1+1,ptr_dir2-ptr_dir1-1);
//Cierro la cadena:
Cadx[ptr_dir2-ptr_dir1-1]='\0';

//Agrego "Cadx" al final de "Cad1"
strcat(Cad1,Cadx);

//Hasta aquí tengo en Cad1 "ABCxxx" me falta XYZ, para ello hago asi:
Cadx[0]='X';
Cadx[1]='Y';
Cadx[2]='Z';
Cadx[3]='\0';

//Agrego "Cadx" al final de "Cad1"
strcat(Cad1,Cadx);

Asi obtengo Cad1="ABCxxxXYZ" y funciona pero mi pregunta es: hay una mejor manera de hacer esto?

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Hay una mejor manera de hacer esto?
« Respuesta #1 en: 07 de Octubre de 2011, 18:33:06 »
tienes varias formas, depende si usas ccs u otro cambian en algo pero las funciones son parecidas:

o bien: strcpy(Cad1,"ABC"); strcat... strcat... strcat(cad1,"XYZ");

o bien: sprintf(Cad1,"ABC%sXYZ",cadx); (lo que hace es donde esta el %s lo reemplaza por cadx).

la ultima es la mas sencilla, pero te aviso que sprintf ocupa mucha memoria de programacion.

Desconectado jorgejg

  • PIC12
  • **
  • Mensajes: 96
Re: Hay una mejor manera de hacer esto?
« Respuesta #2 en: 10 de Octubre de 2011, 12:08:04 »
Uso C18, probaré ambas formas entonces, si lo hago mediante for será mas eficiente o que seria mejor? parece que strcat es mejor que sprintf por el lado de la memoria de programa pero en codigo sprintf tiene mas ventaja según veo.

Aunque mas que nada el asunto está en poder extraer una subcadena dentro de una cadena de forma lo mas practica posible.
« Última modificación: 10 de Octubre de 2011, 12:11:39 por jorgejg »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Hay una mejor manera de hacer esto?
« Respuesta #3 en: 10 de Octubre de 2011, 13:19:03 »
en C18 tienes que tener en cuenta que las cadenas tipo "talcual" las almacena en la memoria flash (ROM), por lo cual si quieres hacer un strcpy debes usar otro (strcpypgm2ram).

El sprintf como te he dicho usa muchos recursos, alrededor de 1k de rom creo recordar, si tienes que manejar muchos strings deberias usarlo ya que 1k solo lo usa una vez, luego cada vez que lo llames en otras funciones no consume mas memoria. Si es para poca cosa con el strcpy te vale.

Desconectado jorgejg

  • PIC12
  • **
  • Mensajes: 96
Re: Hay una mejor manera de hacer esto?
« Respuesta #4 en: 10 de Octubre de 2011, 13:57:59 »
Tengo 16K pero aun asi si lo puedo hacer con algo mas optimo pues mejor, si ves el codigo que puse estoy usando strchr, strncpy y strcat, creo que lo seguiré usando entonces según tus recomendaciones.

Ahora llendo mas al codigo crees que se puede plantear de una mejor manera lo que hice al inicio o en todo caso de que otra forma se podria hacer? Disculpa mi insistencia es que como no tengo mucha practica en c18 pienso que debe haber de hecho una mejor manera de hacer esto mismo.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Hay una mejor manera de hacer esto?
« Respuesta #5 en: 10 de Octubre de 2011, 14:12:59 »
te refieres al ABC no??

ya te lo comente, seria strcpypgm2ram(cad,"ABC");

Desconectado jorgejg

  • PIC12
  • **
  • Mensajes: 96
Re: Hay una mejor manera de hacer esto?
« Respuesta #6 en: 10 de Octubre de 2011, 14:17:30 »
No, en realidad si lees bien mi pregunta mas que nada está enfocada a como extraer la subcadena "xxx" de la cadena "PQRST,xxx,MNL" de una forma mas eficiente de la que he planteado como una posible solución.


 

anything