Autor Tema: funcion strcpy  (Leído 2730 veces)

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

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
funcion strcpy
« en: 25 de Agosto de 2016, 13:28:02 »
Saludos,
¿Alguien sabe como agrego un  "\r" y un "\n"  al string en esa misma linea?
osea quiero agregar "dos puntos, espacio, coma, \r"
Código: C
  1. char string term[4],
  2. strcpy(term,": ,");                        // copiar :,_

Ya se que puedo hacerlo por cada espacio del array.
Gracias
« Última modificación: 25 de Agosto de 2016, 13:31:59 por cvargcal »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:funcion strcpy
« Respuesta #1 en: 25 de Agosto de 2016, 13:45:09 »
Código: C
  1. ": ,\r\n"
el tema que si es un string tiene que terminar con 0x00, es decir un elemento mas, por lo tanto tendrias 6 lugares y no 4 como estas usando. Otra al momento de definirlo:

Código: C
  1. char string term[] = ": ,\r\n";
« Última modificación: 25 de Agosto de 2016, 14:21:55 por KILLERJC »

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:funcion strcpy
« Respuesta #2 en: 25 de Agosto de 2016, 15:29:14 »
Código: C
  1. ": ,\r\n"
el tema que si es un string tiene que terminar con 0x00, es decir un elemento mas, por lo tanto tendrias 6 lugares y no 4 como estas usando. Otra al momento de definirlo:

Código: C
  1. char string term[] = ": ,\r\n";


Gracias,intento hacer esto:
Código: C
  1. void main()  {
  2. char string[20], term[4], *ptr;
  3. char data1[10];
  4. char data2[10];
  5. char NB[10];
  6. char V[10];
  7. strcpy(string,"+CBC: 0,100,4207\r\nOK\r\n");   // ejemplo de lo que debe llegar
  8. strcpy(term,": ,\r");  // Seperacion por  : _ , \r
  9. ptr = strtok(string, term);
  10.  
  11. while(ptr!=0) {
  12.       strcpy(data1,ptr);                          // 1ra Palabra
  13.       strcpy(data2, strtok(NULL,term));           // 2ra Palabra
  14.       strcpy(NB, strtok(NULL ,term));             // 3ra Palabra, Nivel de Bateria
  15.       strcpy(V, strtok(NULL,term));               // 4ra Palabra, Voltaje
  16.      
  17.       ptr = strtok(0, term);
  18.    }
  19.    
  20.    printf("%s\r\n", data1);
  21.    printf("%s\r\n", data2);
  22.    printf("%s\r\n", NB);
  23.    printf("%s\r\n", V);
  24.  
  25. }

Intento separar palabras, hasta el "\r", pero no me funciona, porque entonces la primera palabra seria hasta el primer "\r"  :shock:
voy a  buscar otra forma.

Al final debe imprimir esto:
+CBC
0
100
4207

« Última modificación: 25 de Agosto de 2016, 15:36:21 por cvargcal »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:funcion strcpy
« Respuesta #3 en: 25 de Agosto de 2016, 16:00:13 »
Entonces de esto:

Código: C
  1. "+CBC: 0,100,4207\r\nOK\r\n"

Queres obtener esto:

Código: [Seleccionar]
+CBC:
0
100
4207
OK

Es asi ? Este codigo lo realiza (probado en eclipse con GCC Linux)

Código: C
  1. const char delimitador[]=": ,\r\n";
  2.  
  3. int main(void) {
  4.         char string[20], *ptr;
  5.         int i;
  6.         char datos[8][10];          // 8 por si se necesita mas de 5 que es este string, sino con 5 basta
  7.         strcpy(string,"+CBC: 0,100,4207\r\nOK\r\n");   // ejemplo de lo que debe llegar
  8.         ptr = strtok(string, delimitador);
  9.  
  10.         i=0;
  11.         while(ptr != NULL)
  12.         {
  13.             strcpy(&datos[i][0],ptr);
  14.             i++;
  15.             ptr = strtok(NULL,delimitador);
  16.         }
  17. }

Si no te importa el OK y queres cortarlo al primer \r, entonces tal ves te convenga primero pasar por todos los lugares buscando el \r o \n y apenas encuentre 1 le ponga un 0x00 y ademas salga. Antes de comenzar lo del token.

Código: C
  1. const char delimitador[]=": ,\r\n";
  2.  
  3. int main(void) {
  4.         char string[25], *ptr;
  5.         int i;
  6.         char datos[8][10];
  7.         strcpy(string,"+CBC: 0,100,4207\r\nOK\r\n");   // ejemplo de lo que debe llegar
  8.  
  9.  
  10.         ptr = string;
  11.         while(*ptr)
  12.         {
  13.                 if(*ptr == '\r' || *ptr == '\n')
  14.                 {
  15.                         *ptr = '\0';
  16.                         break;
  17.                 }
  18.                 ptr++;
  19.         }
  20.  
  21.         ptr = strtok(string, delimitador);
  22.  
  23.         i=0;
  24.         while(ptr != NULL)
  25.         {
  26.             strcpy(&datos[i][0],ptr);
  27.             printf("%s\r\n",&datos[i][0]);
  28.             i++;
  29.             ptr = strtok(NULL,delimitador);
  30.         }
  31.  
  32.         return EXIT_SUCCESS;
  33. }

Salida:

Código: [Seleccionar]
+CBC:
0
100
4207
OK

La ventaja anterior es que no importa si no existe la "\n" o la "\r", funcionaria igual. Otra forma seria que si supone que SI o SI primero va el \r primero y luego le sigue SI o SI un \n seria hacer:


Código: C
  1. const char delimitador[]=": ,\r";
  2.  
  3. int main(void) {
  4.         char string[25], *ptr;
  5.         int i;
  6.         char datos[8][10];
  7.         strcpy(string,"+CBC: 0,100,4207\r\nOK\r\n");   // ejemplo de lo que debe llegar
  8.  
  9.         ptr = strtok(string, delimitador);
  10.  
  11.         i=0;
  12.         while(ptr != NULL)
  13.         {
  14.                 if(*ptr != '\n')
  15.                 {
  16.                         strcpy(&datos[i][0],ptr);
  17.                         printf("%s\r\n",&datos[i][0]);
  18.                         i++;
  19.                 }
  20.             ptr = strtok(NULL,delimitador);
  21.         }
  22.  
  23.         return EXIT_SUCCESS;
  24. }

La ventaja es no tener que pasar por todos los elementos de antes, la desventaja es que SI o SI depende que exista "\r" y "\n" juntos y en orden.
La salida es la misma que la anterior, sin el OK
« Última modificación: 25 de Agosto de 2016, 16:20:06 por KILLERJC »

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:funcion strcpy
« Respuesta #4 en: 25 de Agosto de 2016, 16:22:39 »
.......

Si no te importa el OK y queres cortarlo al primer \r, entonces tal ves te convenga primero pasar por todos los lugares buscando el \r o \n y apenas encuentre 1 le ponga un 0x00 y ademas salga. Antes de comenzar lo del tocken.

Muchas gracias, al final lo que hice con
Código: C
  1. char term[] = ": ,"
y recorte  el ultimo dato  en otro string para no tomar lo que sigue de \r\n. Pero muchas gracias, voy aprobar tu código.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:funcion strcpy
« Respuesta #5 en: 25 de Agosto de 2016, 19:25:15 »
.....

Excelente, esta genial ese código, me gusta más de esa forma!! :-/
Aunque CCS no reconoce return EXIT_SUCCESS,  toco poner 0.
¿Cómo hago para separar el arreglo, así como lo tengo en el primer código?

 
Código: C
  1. printf("%s\r\n", data1);
  2.    printf("%s\r\n", data2);
  3.    printf("%s\r\n", NB);
  4.    printf("%s\r\n", V);

Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:funcion strcpy
« Respuesta #6 en: 26 de Agosto de 2016, 00:29:40 »
Código: C
  1. printf("%s\r\n", &datos[0][0]);
  2.    printf("%s\r\n", &datos[1][0]);
  3.    printf("%s\r\n", &datos[2][0]);
  4.    printf("%s\r\n", &datos[3][0]);

o ya que lo puse sobre un array para que se pueda usar en un loop:

Código: C
  1. for(i=0;i<4;i++)
  2. {
  3.    printf("%s\r\n", &datos[i][0]);
  4. }


Citar
Aunque CCS no reconoce return EXIT_SUCCESS,  toco poner 0.

Fue mi culpa, me olvide borrarlo, es que en la PC lo necesitas para que el Sistema Operativo no piense que se cerro mal la aplicacion.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:funcion strcpy
« Respuesta #7 en: 26 de Agosto de 2016, 01:13:35 »
Perfecto!! gracias. :-/ :-/
Una ultima cosa ¿cómo es eso de que la PC lo necesita,  de que forma pruebas tus códigos?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:funcion strcpy
« Respuesta #8 en: 26 de Agosto de 2016, 01:23:52 »
Perfecto!! gracias. :-/ :-/
Una ultima cosa ¿cómo es eso de que la PC lo necesita,  de que forma pruebas tus códigos?

De la forma que mas a mano tenga, con MPLAB, o con eclipse (GCC Linux) que tienen simuladores y/o debuggers. (en este caso con eclipse )

https://www.gnu.org/software/libc/manual/html_node/Exit-Status.html

Pienso que no es "obligatorio" pero le indica al Sistema operativo ( Linux ) que la aplicacion se termino de forma correcta.


 

anything