Dev - C++ - Duda con cadenas en c

 
Vista:
sin imagen de perfil

Duda con cadenas en c

Publicado por Ángel (5 intervenciones) el 24/07/2017 02:45:17
Necesito buscar el numero de apariciones de una cadena en un texto y no se como hacerlo en c.
Estoy intentando usar la funcion strstr():
char *strstr(const char *s1, const char *s2);
La función retorna un puntero a la cadena encontrada, o un puntero nulo si no se encontró la cadena. Si s2 apunta a una cadena de longitud cero, la función retorna s1.
Pero no lo consigo.
Tengo las palabras que buscar en un vector y estoy haciendo un for para ir cogiendolas:


1
2
3
4
5
6
7
8
9
10
11
12
13
for(int j=0;j<numdatos1;j+=(longs+1)){
 
 
   if(strstr(fichero, &contraseñas[j] ) == fichero){
    printf("%d \n",j);
    printf("El contador es:%d \n",contador);
    contador++;
    longs= strlen(&contraseñas[j]);
 
   }
 
   }
   printf("El contador es:%d \n",contador);

en la condicion del strstr no se bien que poner, porque no se si me servira esta funcion, alguna idea??


Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Duda con cadenas en c

Publicado por Thanatos (199 intervenciones) el 24/07/2017 12:57:09
No es recomendable que utilices caracteres como á, é, í, ó, ú, ñ, etc., al nombrar las variables; como lo hiciste al nombrar el array contraseña.

No estoy seguro si estás utilizando una cadena que contiene todos los datos en ella:

1
char contrasenias[] = "pwd1 pwd2 pwd3 pwd2 pwd2 pwd5 pwd2";

O si se trata de un array con esta forma:

1
char contrasenias[][10] = { "pwd1", "pwd2", "pwd3", "pwd2", "pwd2", "pwd5", "pwd2" };


Para el primer caso, te servirá la función strstr():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>  // strlen(), strstr()
 
int main(void)
{
    const char contrasenias[] = "pwd1 pwd2 pwd3 pwd2 pwd2 pwd5 pwd2";
    const char buscada[] = "pwd2";
 
    const char *origen = contrasenias;
    size_t longitud = strlen(buscada);
    int cont = 0;
 
    if (longitud)
    {
        while ((origen = strstr(origen, buscada)))
        {
            origen += longitud;
            ++cont;
        }
    }
    printf("coincidencias = %d\n", cont);
 
    return 0;
}


Para el segundo caso, la función strcmp():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>  // strcmp()
 
#define SIZE 5
 
int main(void)
{
    const char contrasenias[][SIZE] = {
        "pwd1", "pwd2", "pwd3", "pwd2", "pwd2", "pwd5", "pwd2"
    };
    const char buscada[] = "pwd2";
    int cont = 0;
 
    for (size_t i = 0; i < sizeof(contrasenias) / sizeof(contrasenias[0]); ++i)
    {
        if (strcmp(contrasenias[i], buscada) == 0)
        {
            ++cont;
        }
    }
    printf("coincidencias = %d\n", cont);
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Duda con cadenas en c

Publicado por Ángel (5 intervenciones) el 24/07/2017 13:31:06
Muchas gracias por contestar.
Tengo en uno de los vectores esto: [H][O][L][A][\0][A][B][C][\0]....
y en el otro todo el fichero que he leido con read() osea:[H][O][L][A][A][B][C][X][X][X]....
Asi que la primera.
Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Duda con cadenas en c

Publicado por Ángel (5 intervenciones) el 24/07/2017 23:45:27
Lo que no entiendo es por que haces origen += longitud; dentro del while.
Si me lo pudieses explicar te agradecería.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Duda con cadenas en c

Publicado por Thanatos (199 intervenciones) el 25/07/2017 03:23:29
En la línea 9 se declara el puntero origen y se hace que apunte a la primera posición del array contrasenias:

1
const char *origen = contrasenias;

01

Es desde esta posición del arreglo que se iniciará la búsqueda.


Cuando la línea 15 se ejecuta por primera vez, la función strstr() busca la primera coincidencia de la subcadena buscada y devuelve un puntero al primer carácter de la subcadena que encontró, ese valor devuelto por la función se le asigna al puntero origen.

Como la función strstr() encontró la subcadena buscada, la condición de la sentencia while se cumple y se ejecutan las líneas 17 y 18.

En la línea 17, se agrega la longitud de la cadena buscada al puntero, para que origen apunte a la posición de memoria que está inmediatamente después del final de la primera coincidencia de la cadena buscada:

02


La longitud es de 4, se recorren esas 4 posiciones y el puntero origen apunta a una nueva posición:

03


En la siguiente iteración del bucle while, la función strstr() empezará la búsqueda a partir de esa posición (descartando las posiciones del array que tienen fondo blanco).
Al ejecutarse la función strstr() nuevamente, origen apuntará a la primera posición de la siguiente cadena buscada.

Estas son las posiciones a las que apuntará origen en las siguientes iteraciones.

04
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Duda con cadenas en c

Publicado por Ángel (5 intervenciones) el 25/07/2017 12:07:19
Vale ya esta, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar