substring en array char

Iniciado por soyloqbuskas, 21 Septiembre 2012, 02:45 AM

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

xiruko

vaya pensaba que haciendo eso alterabas la cadena original haciendo que el puntero ya no apuntase al principio de la cadena despues de la funcion, pero lo he ejecutado y funciona correctamente. supongo que cuando le pasas un puntero a una funcion, este es una copia y no el original.

pensaba que esto ya lo tenia claro pero siempre se aprende algo nuevo xD

un saludo!

soyloqbuskas

¡Buenas a todos!

Xiruko, andamos cerca pero no damos en el clavo! jaja a ver si nos sale :-)

Citarno imprimira todo, imprimira desde el primer "bien" hasta el final de la cadena

Efectivamente, pero yo no quiero que me imprima hasta el final de la cadena quiero que imprima desde que encuentra la cadena hasta el primer \n.

Ejemplo:

Citar
unsigned char* cadena="hola\nque tal\nbien\n"
Resultado:
que tal
/******************************************/
unsigned char* cadena="hola\nque tal\nbien\n¿que haces hoy?"
Resultado:
que tal
que haces hoy?

Para conseguir estos resultados 1º hacer un bucle que me trocee la cadena usando como delimitador el \n y me lo guarde en una variable y luego a esa variable hacer el strstr().

Gracias a todos por las respuestas, un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

soyloqbuskas

#12
¡AL FIN! jajaja

Ya tengo el codigo, no me puedo creer que me haya atascado tanto en un funcion tan simple jaja


#include <stdio.h>
#include <string.h>

int main(){

       unsigned char * cadena="aaaa\nbbbb\nccccc1\ndddddd\nccccc2\nffff\nccccc3";

       char* buscar="ccc";

       char aux[50]="";  //array donde llenaremos con la cadena troceada
       char* result="";
       int i=0;
       int j=0;
       int longitud=strlen((char*)cadena);

       for(i=0;i<longitud;i++){
               if(cadena[i]!='\n'){  // si no hay \n  sigue llenando aux.
                       aux[j]=cadena[i];
                       j++;
               }
               else{   // hay un \n, busca en el interior de aux
                       aux[j]='\0';
                       result=strstr((char*)aux,buscar);
                       if(result){
                               printf("Encontrado: %s\n",result);  //si encuentras imprime
                               // return 0;  Si quieres que solo imprima el primero descomenta la linea.
                        }
                       j=0;
               }
       }

       //ahora hay que imprimir el ultimo porque el bucle solo imprime hasta que encuentra un \n
       result=strstr((char*)aux,buscar);
       if(result) printf("Encontrado: %s\n",result);

       return 0;
}


Muchas gracias a todos por vuestra ayuda, un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

rir3760

No es necesario copiar la cadena en un array auxiliar. En su lugar puedes utilizar "strstr" para buscar la subcadena, si se encuentra utilizas "strchr" para buscar el carácter '\n' después de esta.

Tu programa con esas modificaciones:
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *cadena = "aaaa\nbbbb\nccccc1\ndddddd\nccccc2\nffff\nccccc3";
   char *buscar = "ccc";
   size_t nc_buscar = strlen(buscar);
   char *p;
   char *q;
   
   p = cadena;
   while ((p = strstr(p, buscar)) != NULL){
      if ((q = strchr(p + nc_buscar, '\n')) != NULL){
         printf("%.*s\n", q - p, p);
         p = q + 1;
      }else {
         printf("%s\n", p);
         break;
      }
   }
   
   return 0;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language