Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Sacar texto entre 2 palabras

Estas en el tema de Sacar texto entre 2 palabras en el foro de C/C++ en Foros del Web. Hola a todos, hace años que conozco el foro pero es la primera vez que participo en el. Tengo una maquina a la cual le ...
  #1 (permalink)  
Antiguo 01/11/2015, 16:14
 
Fecha de Ingreso: noviembre-2015
Mensajes: 3
Antigüedad: 8 años, 6 meses
Puntos: 0
Sacar texto entre 2 palabras

Hola a todos, hace años que conozco el foro pero es la primera vez que participo en el.

Tengo una maquina a la cual le mandar comando los comandos por el serial, los comandos pueden ser como estos:

ESC 'D' CR ESC "#000027D8" CR ESC 'E' CR

Los comandos los comandos recibidos los almaceno en un string, mi problema o duda viene de como sacar y separar esos comandos del string y pasarlos a un array para analizarlos posteriormente. Con el ejemplo anterior obtendría 3 comandos:

ESC 'D' CR
ESC "#000027D8" CR
ESC 'E' CR

Este código lo quiero hacer para Arduino con lo cual tendría que ser en C.

Me podeis asesorar como puedo hacer para sacar estas instrucciones a un array, creo que esto se debería hacer con punteros, pero no se como.

Muchas gracias.
  #2 (permalink)  
Antiguo 01/11/2015, 19:48
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Sacar texto entre 2 palabras

Si puedes usar la librería de c string.h tienes varias opciones es que te pueden valer como strstr, strtok, o strchr. Lo ideal seria que los comandos los mandase separados por algún carácter para poder saber donde acaba. Por ejemplo:ESC 'D' CR;ESC "#000027D8" CR;ESC 'E' CR
Donde los ; indicaría donde terminan y con las funciones que te digo o usando un bucle seria muy sencillo separar los comandos.
  #3 (permalink)  
Antiguo 02/11/2015, 02:31
 
Fecha de Ingreso: noviembre-2015
Mensajes: 3
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Sacar texto entre 2 palabras

aguml, gracias por tu respuesta.

Los comandos empiezan con ESC y terminan con CR, si estuvieran separados por un ; o un " me seria mucho más fácil...

Le hecho un vistazo a strstr, strtok, o strchr.

Un saludo.
  #4 (permalink)  
Antiguo 02/11/2015, 03:07
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Sacar texto entre 2 palabras

Entonces prueba a separar las palabras por espacios.

Una vez tengas eso, recorres el array de palabras... si la palabra actual es ESC entonces está empezando un comando al encontrar CR el comando finaliza.
  #5 (permalink)  
Antiguo 02/11/2015, 05:08
 
Fecha de Ingreso: noviembre-2015
Mensajes: 3
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Sacar texto entre 2 palabras

Hola, muchas gracias, no avía caído en lo de separar por espacios. Menos mal que he consultado nuevamente el post, ya que los estaba haciendo con una serie de bucles que copiaban el texto entre ESC y CS, un jaleo.

Código:
#include <stdio.h>
#include <string.h>

int main()
{
    char s1[250] = "ESC 'D' CR ESC \"#000027D8\" CR ESC 'E' CR ";
    char s2[4] = " \n\t";
    char *ptr;
    
    printf( "s1=%s\n", s1 );
    
    ptr = strtok( s1, s2 );    // Primera llamada => Primer token
    printf( "%s\n", ptr );
    while( (ptr = strtok( NULL, s2 )) != NULL )    // Posteriores llamadas
        printf( "%s\n", ptr );
    
    return 0;
}
El resultado el que necesitaba:
s1=ESC 'D' CR ESC "#000027D8" CR ESC 'E' CR
ESC
'D'
CR
ESC
"#000027D8"
CR
ESC
'E'
CR
Program ended with exit code: 0

Con la última parte del código me pierdo un poco y no lo comprendo:

Código:
    ptr = strtok( s1, s2 );    // Primera llamada => Primer token
    printf( "%s\n", ptr );
    while( (ptr = strtok( NULL, s2 )) != NULL )    // Posteriores llamadas
        printf( "%s\n", ptr );
La explicación dice:
Cita:
Posteriores llamadas retornarán más tókens. Si ya no encuentra más delimitadores, entonces retornará todos los caracteres desde el último delimitador para ser el último token. Si ya se retornó el último token, entonces retornará un puntero nulo con demás llamadas a la función.
[URL="http://http://c.conclase.net/librerias/?ansifun=strtok"]http://http://c.conclase.net/librerias/?ansifun=strtok[/URL]

Un saludo y muchas gracias.
  #6 (permalink)  
Antiguo 02/11/2015, 05:17
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Sacar texto entre 2 palabras

strtok almacena internamente eun puntero a la cadena que estás troceando, de tal manera que únicamente tienes que facilitarle dicho dato la primera vez.

En la segunda llamada y sucesivas (siempre que estés troceando la misma cadena) no hace falta pasarle la cadena. En su lugar se pasa NULL, que es equivalente a 0, y que en el caso de los punteros indica un puntero no inicializado, vamos que no apunta a nada válido.

Cuando strtok comprueba que lo que le has pasado es un NULL pasa a utilizar su puntero interno en vez del puntero recibido como argumento.

Un saludo
  #7 (permalink)  
Antiguo 02/11/2015, 05:49
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Sacar texto entre 2 palabras

Pero eso no es lo que dijiste que querías. Para lo que dices yo hubiese usado dos punteros y strstr, uno para buscar la cadena ESC y el otro para CR.
Primero buscas ESC y almacenas la dirección y si no es null usas ese puntero para pasárselo otra vez a strstr pero esta vez buscas CR y almacenas el resultado en el segundo puntero y si no es null le incrementas 2. Luego puedes usas otra función como strncpy ya que tienes la posición inicial y final así que posFinal - posInicial te de el número de bites a copiar.

Etiquetas: string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:19.