Como puedo hacer esto:
abro un archivo .txt (listo)
Pongo una palabra (listo)
Que cuente cuantas veces esta esa palabra en el archivo (eso me falta)
como lo puedo hacer :S
| |||
Cita: y como se podria hacer con el strstr() ??
Iniciado por Eternal Idol Siendo un archivo de texto, imagino que con un tamaño bastante chico, podes leer todo el archivo en un buffer y usar alguna funcion de busqueda de cadenas tipo strstr(). porque si tengo Hola Como estas? y pongo... la saldria la Como estas? :S como lo puedo hacer con esa funcion? |
| ||||
ststr() te devuelve un puntero asi que lo podes hacer perfectamente comparando los caracteres anterior y posterior. Si es un \r, \n o espacio lo tomas como valido y sino no. Tambien tenes que comprobar el comienzo y final del buffer que contiene el texto para no pasarte de los limites en la comprobacion.
__________________ ¡Peron cumple, Evita dignifica! VIVA PERON CARAJO |
| |||
Cita: Pues no. Primero, que es más complicado y tiene menos rendimiento. Si existe una función que "busca subcadenas en cadenas", usa esa coñe. Que manía de hacer las cosas mal.
Iniciado por Instru puedes ir usando fscanf(que lee hasta encontrar un espacio) y strcmp para hacerte la vida mas facil. Saludos strstr() te pide dos punteros a cadena. El primero es la cadena DONDE se buscará, y el segundo la cadena A buscar. Devuelve un puntero a la primera posición de la primera aparición. Si no existe, devuelve NULL. Por lo tanto, con hacer: char frase[100] = "En un lugar de la Mancha, Paco el de los palotes estaba caminando."; char buscar[100] = "Paco"; if(strstr(frase,buscar)==NULL) printf("paco no esta"); else printf("paco esta"); |
| |||
pero yo no quiero saber si esta o no esta es palabra por ejemplo tengo char p[100]="Hola a todos como esta, hola denuevo como hola todos"; // mi cadena chat p2[100]="hola"; // palabra a busca resultado La palabra "hola" esta "3" veces que no importe si es como mayuscula o minuscula |
| |||
Cita: Sobre lo de "mayusculas-minusculas"... Puedes pasar todo a mayúsculas.
Iniciado por Goku00_1 pero yo no quiero saber si esta o no esta es palabra por ejemplo tengo char p[100]="Hola a todos como esta, Hola denuevo como Hola todos"; // mi cadena chat p2[100]="hola"; // palabra a busca resultado La palabra "hola" esta "3" veces que no importe si es como mayuscula o minuscula Para hacerlo, un while bastaría (lo de buscar cuántas veces):
Código:
Salida:#include <stdio.h> #include <ctype.h> #include <string.h> #include <malloc.h> int Contar(char * t1, char * t2) { char * p1 = (char *) malloc(strlen(t1)*sizeof(char)+1); char * p2 = (char *) malloc(strlen(t2)*sizeof(char)+1); int i; char * temp = p1; for(i=0;t1[i]!='\0';i++) p1[i]=toupper(t1[i]); p1[i]='\0'; for(i=0;t2[i]!='\0';i++) p2[i]=toupper(t2[i]); p2[i]='\0'; i=0; while((temp = strstr(temp,p2))!=NULL) { temp++; i++; } free(p1); free(p2); return i; } int main() { char p1[100]="hola a todos como esta, Hola de nuevo como Hola todos"; char p2[100]="hOlA"; printf("%i\n",Contar(p1,p2)); return 0; } 3 Como ves, lo que llamabas tú Instru "tan complicado", se reduce a una línea:
Código:
while((temp = strstr(temp,p2))!=NULL) { temp++; i++; } *** EDITADO *** Te he "despejado" o "aislado" todo en una función para que la puedas usar sin preocuparte :) Última edición por MaxExtreme; 17/04/2005 a las 11:29 |
| |||
Las otras librerías son = de estándar que ésas. #include <ctype.h> // Función ctype #include <malloc.h> // Memoria dinámica Si te lo han mandado en C y con limitaciones (ejercicio de universidad), puedes no usar la función (así te ahorras usar la memoria dinámica) y lo metes directamente todo en main. Sobre la función "toupper", la puedes imitar (pero si es para universidad no te digo más). Simplemente pasas toda cadena con un for y si es una letra minuscula la sumas la diferencia ASCII entre mayúsculas y minúsculas. |
| |||
no es para la Universidad... es que tengo un libro de C, y lo lei, y al final salen 200 ejecicios y este es el numero 26 y no me sale.... por eso quiero la ayuda... :( Aun no voy a la Universidad solo tengo 15 años =) |
| |||
Cita: ¡¡ Entonces haz lo que te digo !!
Iniciado por Goku00_1 no es para la Universidad... es que tengo un libro de C, y lo lei, y al final salen 200 ejecicios y este es el numero 26 y no me sale.... Cita: :O ¡ Estoy asombrado !
Iniciado por Goku00_1 solo tengo 15 años =) |
| |||
malloc.h no forma parte de la biblioteca estandard de C89 y C99. En lo que concierne al prototipo de la funcion malloc este se encuentra en stdlib.h por lo que no seria necesario utilizar malloc.h, esto por supuesto siempre y cuando el compilador que se utilice soporte el estandard de C. Un saludo |
| ||||
Cita: Donde dije que "tan complicado"?Como ves, lo que llamabas tú Instru "tan complicado", se reduce a una línea: Si verdad la mania de hacer las cosas mal y de leer mal como veo yo. Lo que te dije es bueno y sirve. y siquieres leerlo desde un arreglo puedes usar sscanf que lee pero en vez del stdin o de un archivo, de el arreglo que tu le digas. Despues comparas y si esta pues igualmente puedes incrementar el contador. Pero bueno, ya le salio, solo digo otra manera de hacerlo que NO ESTA MAL, solo es diferente. saludos |
| ||||
HOLA! talves esto te ayude... #include<stdio.h> #include<conio.h> int buscar(char *base, char *strbuscar); void main(void){ char *str="hola, soy SysopNecho y digo hola a quien me dice hola"; char *str2="hola"; int nveces=buscar(str,str2); printf("SysopNecho dijo hola %d veces", nveces);} int buscar(char *base, char *strbuscar){ int pos1=0; int pos2=0; int cont=0; while(base[pos1]!='\0'){ if(base[pos1]==strbuscar[pos2]){ pos2++; if(strbuscar[pos2]=='\0'){ pos2=0; cont++; } }else{ pos2=0; } pos1++; } return cont;} Última edición por SysopNecho; 17/04/2005 a las 21:20 |
| |||
Cita: Cierto, pero aún así staba en lo correcto al decir que usase la función tal y como la había dejado. Una cosa es un ejercicio de libro y otra uno de universidad.
Iniciado por rir3760 malloc.h no forma parte de la biblioteca estandard de C89 y C99. En lo que concierne al prototipo de la funcion malloc este se encuentra en stdlib.h por lo que no seria necesario utilizar malloc.h, esto por supuesto siempre y cuando el compilador que se utilice soporte el estandard de C. Un saludo |
| |||
Cita: ¿Bueno? No. Tú intentas decir que se usen funciones para emular otra que ya está implementada. Yo siempre intento decir que se use lo que se debe usar.
Iniciado por Instru Donde dije que "tan complicado"? Si verdad la mania de hacer las cosas mal y de leer mal como veo yo. Lo que te dije es bueno y sirve. y siquieres leerlo desde un arreglo puedes usar sscanf que lee pero en vez del stdin o de un archivo, de el arreglo que tu le digas. Despues comparas y si esta pues igualmente puedes incrementar el contador. Pero bueno, ya le salio, solo digo otra manera de hacerlo que NO ESTA MAL, solo es diferente. saludos . . . Cita: Ahí dijistes que lo mío era más complicado...
Iniciado por Instru puedes ir usando fscanf(que lee hasta encontrar un espacio) y strcmp para hacerte la vida _>_mas facil_<_. |
| |||
Cita:
Iniciado por Instru Yo no dije que fuera complicdo lo tuyo, eso es lo que tu supones. Yo solo di una opcion que es facil de usar por si no quieres usar las funciones que tu propones. saludos Si la tuya es _más_ fácil de usar, la mía es _menos_ fácil. Lógica. :) Las funciones que "yo propongo" son las que están creadas específicamente para eso. |
| |||
Cita:
Iniciado por MaxExtreme Si la tuya es _más_ fácil de usar, la mía es _menos_ fácil. Lógica. :) Las funciones que "yo propongo" son las que están creadas específicamente para eso. Oye, no me agrada que tengas eso en tu firma MaxExtreme. Sobre todo cuando NO dije eso. Te pido de favor que la quites, ya que eso no me parece "chistoso". Y que tu malinterpretas las cosas es otra cosa. |
| |||
MaxExtreme, si dices que strstr() busca "subcadenas dentro de cadenas", entonces no sirve, ya que lo que quiere es contar "palabras dentro de frases". La subcadena "loco" esta en la cadena "Yo coloco eso", pero la palabra "loco" no esta en la frase "Yo coloco eso". A tu solucion habria que añadir la comprobacion de que los caracteres anterior y posterior a lo detectado por strstr() son caracteres que no se pueden encontrar en una palabra: espacios y caracteres especiales. O simplificando caracteres no alfanumericos. Por eso es bueno realizar prepara los casos de prueba antes de escribir el codigo, mientras algun test falle el codigo no es correcto. |
| ||||
Cita: Eso ya habia sido tenido en cuenta:
Iniciado por DarkJ MaxExtreme, si dices que strstr() busca "subcadenas dentro de cadenas", entonces no sirve, ya que lo que quiere es contar "palabras dentro de frases". La subcadena "loco" esta en la cadena "Yo coloco eso", pero la palabra "loco" no esta en la frase "Yo coloco eso". A tu solucion habria que añadir la comprobacion de que los caracteres anterior y posterior a lo detectado por strstr() son caracteres que no se pueden encontrar en una palabra: espacios y caracteres especiales. O simplificando caracteres no alfanumericos. Por eso es bueno realizar prepara los casos de prueba antes de escribir el codigo, mientras algun test falle el codigo no es correcto. Cita:
Iniciado por Eternal Idol ststr() te devuelve un puntero asi que lo podes hacer perfectamente comparando los caracteres anterior y posterior. Si es un \r, \n o espacio lo tomas como valido y sino no. Tambien tenes que comprobar el comienzo y final del buffer que contiene el texto para no pasarte de los limites en la comprobacion.
__________________ ¡Peron cumple, Evita dignifica! VIVA PERON CARAJO |
| ||||
Cita: Tambien habia sido propuesto:
Iniciado por rir3760 Otra opcion es el uso de la funcion strtok (string.h) en combinacion con una funcion que compare cadenas ignorando la diferencia entre mayusculas y minusculas. Un saludo Cita:
Iniciado por Eternal Idol No conozco mucho de PHP pero creo podes hacer algo parecido con strtok().
__________________ ¡Peron cumple, Evita dignifica! VIVA PERON CARAJO |