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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  substring en array char
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: substring en array char  (Leído 7,616 veces)
soyloqbuskas

Desconectado Desconectado

Mensajes: 219


¡El conocimiento es de todos!


Ver Perfil
substring en array char
« en: 21 Septiembre 2012, 02:45 am »

¡Buenas a todos!

Tengo un problemilla con una funcion de C en linux. EL codigo es el siguiente:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4.  
  5.        char cadena[8]={'1','\0','3','4','5','6','\0','8'};
  6.        char * busca="345";
  7.        char* result="resultado";
  8.        char cadena2[8];
  9.        int i=1;
  10.        int aux=1;
  11.        printf("hola\n");
  12.        for(i=1;i<9;i++){
  13.                while((cadena[i]!='\0') && (i<9)){
  14.                        cadena2[aux]=cadena[i];
  15.                        aux++;
  16.                }
  17.                aux=1;
  18.                result=strstr((char*)cadena2,busca);
  19.                if(result!=NULL){ break;break;}
  20.                printf("Resultado: %s\n",result);
  21.        }
  22.        //printf("Resultado: %s",result);
  23.        return 0;
  24. }
  25.  

La idea de este codigo es la siguiente:
Tengo un char [] con caracteres y entre estos caracteres hay varios \0. Lo que quiero es trocear el char[] usando como caracter separador el \0, para luego buscar en el interior de cada trozo de cadena con strstr()

En el array char he puesto los \0 porque creo que es el caracter del salto de linea.

¿Alguien puede hecharme un cable?

Gracias, un saludo.


En línea

"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
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: substring en array char
« Respuesta #1 en: 21 Septiembre 2012, 03:03 am »

el caracter '\0' es el caracter NULL, el cual en C se usa entre otras cosas para indicar el fin de una cadena. el caracter de salto de linea que tu buscas es el '\n' o 10 en ascii. ademas, los arreglos siempre empiezan en la posicion 0, y tu recorres las cadenas empezando por la posicion 1.

luego declarar una cadena asi:

Código
  1. char* busca="345";
  2. char* result="resultado";

realmente no se si se puede. nunca lo he hecho ya que para declarar una cadena inicializada se suele hacer asi:

Código
  1. char busca[]="345";

que ya el solo declara un arreglo de 4 posiciones (3 para los caracteres mas el NULL al final). si tuviera que apostar diria que no se puede hacer como lo has hecho tu, ya que tu ahi estas declarando un puntero pero en ningun momento declaras el espacio necesario para almacenar la cadena "345". pero no lo se seguro y ahora me da algo de pereza probarlo... a ver si alguien mas comenta. sino, escribiendo los errores que te da el compilador podriamos saberlo.

para acabar, "result" es un puntero que te indicara si la funcion strstr() salio bien o no. por lo que no entiendo porque lo inicializas (en el caso de que se pueda hacerlo asi) a "resultado". lo que tendrias que hacer, al igual que con todos los punteros, es inicializarlo a NULL, y luego ya operaras con el.


En línea

soyloqbuskas

Desconectado Desconectado

Mensajes: 219


¡El conocimiento es de todos!


Ver Perfil
Re: substring en array char
« Respuesta #2 en: 21 Septiembre 2012, 03:26 am »

ufffffffff la verdad es que lo he hecho bastante mal......porque para empezar mi funcion no recibe los parametros que he dicho...xD y he estado intentando programar una funcion que luego no me iba a servir (cagada).

De todas formas xiruko ese codigo esta muy machacado, como no me salido he probado todo lo que se me ha ocurrido para ver si me salia....y por eso esta asi de mal...

De todas formas esta declaracion:
Código
  1. char * cadena="loquesea"
Es correcta, aun que no es una buena practica de programacion...

Bueno, voy a replantear mi problema correctamente.

mi funcion recibe un unsigned char*, esta variable tiene un monton de saltos de linea. Quiero buscar un string en su interior. El problema es que strstr() busca hasta que llega al primer salto de linea, y si el string que busco esta despues del primer salto de linea pues no lo va a encontrar....Por ello debo primero trocear el contenido de mi variable unsigned char* usando como separador el salto de linea y luego utilizar el strstr() en cada uno de esos trozos.
En línea

"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
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: substring en array char
« Respuesta #3 en: 21 Septiembre 2012, 04:26 am »

Citar
mi funcion recibe un unsigned char*, esta variable tiene un monton de saltos de linea. Quiero buscar un string en su interior. El problema es que strstr() busca hasta que llega al primer salto de linea, y si el string que busco esta despues del primer salto de linea pues no lo va a encontrar....Por ello debo primero trocear el contenido de mi variable unsigned char* usando como separador el salto de linea y luego utilizar el strstr() en cada uno de esos trozos.

bueno yo acabo de hacer este sencillo ejemplo:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main() {
  5.  
  6. char *resultado=NULL, texto[]="hola que tal\nbien y tu\nbien gracias\n", buscar[]="bien";
  7.  
  8. resultado=strstr(texto, buscar);
  9.  
  10. if (resultado) printf("%s", resultado);
  11. else printf("No se encontro.\n");
  12.  
  13. return 0;
  14. }

y la salida es:

Código:
~$ gcc prueba.c -o prueba
~$ ./prueba
bien y tu
bien gracias
~$

que segun la definicion de la funcion http://c.conclase.net/librerias/?ansifun=strstr esto es exactamente lo que tiene que hacer. no dice nada de que busca hasta encontrar un espacio, al contrario, dice que busca hasta encontrar el caracter nulo de fin de cadena. en este ejemplo que te he puesto, "resultado" apunta a la primera coincidencia que se encuentra, que es el primer "bien", y tendra el valor de toda la cadena hasta el caracter NULL del final.

es esto lo que buscas hacer con tu funcion o es otra cosa? lo que pretendes es encontrar una sola palabra o frase en concreto dentro de la otra?
En línea

soyloqbuskas

Desconectado Desconectado

Mensajes: 219


¡El conocimiento es de todos!


Ver Perfil
Re: substring en array char
« Respuesta #4 en: 21 Septiembre 2012, 05:09 am »

Ya pero si lees bien lo que pone, dice que localiza la primera aparicion solamente, a ti te lo muestra las 2 veces porque imprime hasta el caracter nulo. De hecho si pruebas a cambiar tu variable texto por esta:
Código
  1. texto[]="hola que tal\nbien y tu\ngracias\n¿Por que imprime el gracias y esto?"

Veras como lo imprime todo...
En línea

"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
Javier235

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: substring en array char
« Respuesta #5 en: 21 Septiembre 2012, 07:34 am »

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define LENGTH 9
  5.  
  6. int main(){
  7.  
  8. char cadena[LENGTH]={'1','\0','3','4','5','6','\0','8','\0'};
  9. char cadena2[LENGTH];
  10. char *busca="345";
  11. char *result=NULL;
  12.  
  13. int i, j=0;
  14. for(i=0; i<LENGTH; i++) {
  15. if(cadena[i] != '\0') {
  16. cadena2[j] = cadena[i];
  17. j++;
  18. } else
  19. j=0;
  20.  
  21. result=strstr(cadena2,busca);
  22. if(result!=NULL) {
  23. printf("Resultado: %s. i:%d\n",result, i);
  24. j=0;
  25. } else
  26. printf("no se encontro nada. i:%d\n", i);
  27. }
  28.  
  29. return 0;
  30. }
  31.  

Fijate si te sirve. En teoría tendría que encontrar "345" una sola vez... según lo que vos querés hacer.
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: substring en array char
« Respuesta #6 en: 21 Septiembre 2012, 14:32 pm »

Citar
Ya pero si lees bien lo que pone, dice que localiza la primera aparicion solamente, a ti te lo muestra las 2 veces porque imprime hasta el caracter nulo. De hecho si pruebas a cambiar tu variable texto por esta:

Código
  1. texto[]="hola que tal\nbien y tu\ngracias\n¿Por que imprime el gracias y esto?"

Veras como lo imprime todo...

no imprimira todo, imprimira desde el primer "bien" hasta el final de la cadena, que es exactamente lo que tiene que hacer esa funcion. tu lo que quieres hacer es que solo te imprima la palabra "bien"? quiero decir, tu buscas algo, y si lo encuentra, que te diga que si se encuentra en el texto y donde?

edito: he hecho una funcion para que te diga el numero de veces que una cadena esta en otra. no se si es exactamente lo que buscas, a ver si comentas y lo explicas un poco mejor. espero que te sirva:

Código
  1. int BuscarCadena(char* origen, char* buscar) {
  2.  
  3. int numeroApariciones=0, i=0, j;
  4.  
  5. while (origen[i]!='\0') {
  6.  
  7. for (j=0; j<strlen(buscar); j++)
  8. if (origen[i+j]!=buscar[j]) break;
  9.  
  10. if (j==strlen(buscar)) numeroApariciones++;
  11.                i++;
  12. }
  13.  
  14. return numeroApariciones;
  15. }

edito: para corregir un error en la condicion del while.
« Última modificación: 21 Septiembre 2012, 17:30 pm por xiruko » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: substring en array char
« Respuesta #7 en: 21 Septiembre 2012, 17:13 pm »

Hay un error en esa función: el utilizar el operador "++" en la condición tiene como efecto que la variable "i", en el cuerpo del bucle, sea el indice del siguiente carácter.


Otra forma es utilizando la función "strstr", por ejemplo:
Código
  1. #include <string.h>
  2.  
  3. int num_reps(char const *cad, char const *sub)
  4. {
  5.   size_t nc_sub = strlen(sub);
  6.   int i;
  7.   char *p;
  8.  
  9.   for (i = 0; (p = strstr(cad, sub)) != NULL; i++)
  10.      p += nc_sub;
  11.  
  12.   return i;
  13. }

Un saludo
En línea

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
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: substring en array char
« Respuesta #8 en: 21 Septiembre 2012, 17:28 pm »

Citar
Hay un error en esa función: el utilizar el operador "++" en la condición tiene como efecto que la variable "i", en el cuerpo del bucle, sea el indice del siguiente carácter.

cierto, lo escribi y ejecute y funcionaba, pero claro funcionaba porque la palabra a buscar no estaba justo al inicio de la frase. gracias por el dato, ahora mismo lo corrijo.

luego he probado tu funcion y no me iba, y creo que es porque aunque aumentes el puntero sumandole la longitud de la cadena, luego a la funcion strstr() le vuelves a pasar la cadena original "cad", por lo que el programa entra en un bucle infinito. haciendo esto si que funciona:

Código
  1. char* p=cad;

y luego en la condicion del for le pasas el puntero a strstr() para aumentarlo dentro si encuentra la cadena a buscar:

Código
  1. for (i=0; (p=strstr(p, sub)) != NULL; i++)

un saludo!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: substring en array char
« Respuesta #9 en: 21 Septiembre 2012, 17:57 pm »

he probado tu funcion y no me iba, y creo que es porque aunque aumentes el puntero sumandole la longitud de la cadena, luego a la funcion strstr() le vuelves a pasar la cadena original "cad", por lo que el programa entra en un bucle infinito.
Ouch! Cierto, eso pasa por verificar los programas "en la cabeza". La corrección es como indicas.

Pensándolo un poco no es necesaria una variable local (el puntero "p") ya que se puede utilizar el primer parámetro acortando la función a:
Código
  1. #include <string.h>
  2.  
  3. int num_reps(char const *p, char const *sub)
  4. {
  5.   size_t nc_sub = strlen(sub);
  6.   int i;
  7.  
  8.   for (i = 0; (p = strstr(p, sub)) != NULL; i++)
  9.      p += nc_sub;
  10.  
  11.   return i;
  12. }
  13.  

Un saludo (y gracias por la corrección)
En línea

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error al definir array char en DEV-CPP
Programación C/C++
DA KILLER 6 4,152 Último mensaje 27 Febrero 2012, 13:39 pm
por satu
Funcion que retorne char array? « 1 2 »
Programación C/C++
juancaa 13 18,063 Último mensaje 19 Julio 2012, 16:23 pm
por rir3760
No puedo asignar un char a un array de dos dimensiones
Programación C/C++
SCUMM 5 3,352 Último mensaje 12 Febrero 2014, 16:24 pm
por eferion
Duda con Array c++ 2 Dimensiones y vector de profundiad char nombre[X][Y]
Programación C/C++
jenniferpd 2 2,842 Último mensaje 28 Septiembre 2014, 04:07 am
por rir3760
ayuda array char
Programación C/C++
LAULAU12 7 4,215 Último mensaje 25 Enero 2015, 00:13 am
por LAULAU12
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines