Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Blaster en 30 Mayo 2013, 21:09 pm



Título: Problema con contador de palabra en C
Publicado por: Blaster en 30 Mayo 2013, 21:09 pm
Alguien me puede echar una mano con este codigo que no me compila me tira este error:

Código
  1. error: lvalue required as increment operand

Y aqui esta el codigo que llevo:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void)
  6. {
  7.    char frase[] = "Hola como estas Hola como te va Hola amigo";
  8.    char palabra[] = {"Hola"};
  9.  
  10.    int lon = strlen(palabra);
  11.  
  12.    int i, j = 0;
  13.  
  14.    while(*frase != '\0'){
  15.        i = 0;
  16.        while(*frase != ' ' || *frase != '\0'){
  17.            frase++; // Error en esta linea
  18.            i++;
  19.        }
  20.        if(strncmp(frase - lon, palabra, lon)==0) j++;
  21.  
  22.        if(*frase != '\0')
  23.           frase++; // Y aqui
  24.    }
  25.  
  26.    printf("La palabra Hola se repite %d veces", j);
  27.  
  28.    return 0;
  29. }
  30.  
  31.  

Saludos  :rolleyes:


Título: Re: Problema con contador de palabra en C
Publicado por: amchacon en 30 Mayo 2013, 21:30 pm
No lo puedo probar pero intenta cambiar los corchetes por un *:

Código
  1. char frase[] = "Hola como estas Hola como te va Hola amigo";

Código
  1. char* frase = "Hola como estas Hola como te va Hola amigo";


Título: Re: Problema con contador de palabra en C
Publicado por: Blaster en 30 Mayo 2013, 21:48 pm
amchacon he probado la forma que me indicaste me lanza uno peor de igual forma
estoy buscado por la red informacion al respecto

Saludos


Título: Re: Problema con contador de palabra en C
Publicado por: Blaster en 31 Mayo 2013, 02:56 am
Hola he intentado hacerlo de esta forma pero sigue sin funcionar este me compila
pero al ejecutarlo me indica que mi programa quiere leer una area de memoria que
no esta disponible como puedo correjirlo

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.    char frase[] = "Hola como estas Hola como te va Hola amigo";
  8.    char palabra[] = { "Hola" }, auxiliar[10]={0};
  9.  
  10.    int lon = strlen(palabra);
  11.  
  12.    int i, j = 0;
  13.  
  14.    do{
  15.  
  16.        while(frase[i] != '32')
  17.        {
  18.            auxiliar[i] = frase[i];
  19.            i++;
  20.        }
  21.        auxiliar[i]='\0';
  22.        if(i == lon && strcmp(auxiliar, palabra) == 0)
  23.          j++;
  24.  
  25.          if(frase[i] != '\0')
  26.            i++;
  27.  
  28.    }while(frase[i] != '\0');
  29.  
  30.    printf("La palabra Hola se repite %d veces", j);
  31.  
  32.    return 0;
  33. }
  34.  
  35.  

Saludos  


Título: Re: Problema con contador de palabra en C
Publicado por: leosansan en 31 Mayo 2013, 17:31 pm

Pues a mí si me compila, pero con unas pequeñas variaciones :)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    char frase[] = "Hola como estas Hola como te va Hola amigo";
  7.    char palabra[] =  "Hola" , aux[10]={0},aux0[10]="";
  8.    int i=0, j = 0;
  9.  
  10.    do
  11.    {
  12.        if(frase[i]=='H' && frase[i+3]=='a')
  13.            j++;
  14.        i++;
  15.    }while(frase[i] != '\0');
  16.    printf("La palabra %s se repite %d veces con do-while\n" , palabra, j);
  17.  
  18.    /************ otra forma************/
  19.  
  20.   char *p;
  21.    i=0;
  22.    for (p = frase; (p = strstr(p, "Hola")) != NULL; p += 2)
  23.        i++;
  24.    printf("La palabra %s se repite %d veces con strstr.\n",palabra, j);
  25.  
  26.    /************ otra forma************/
  27.  
  28.    int k=0;
  29.    i=0, j = 0;
  30.    for (i=0;frase[i] != '\0' ;i++)
  31.    {
  32.        if (frase[i] != ' ')
  33.            aux[k] = frase[i];
  34.        k++;
  35.        if (frase[i] == ' ')
  36.        {
  37.            aux[k-1]='\0';
  38.            k=0;
  39.            if (strcmp (palabra,aux)==0)
  40.                j++;
  41.            strcpy(aux,aux0);
  42.        }
  43.    }
  44.     printf("La palabra %s se repite %d veces con strcmp", palabra,j);
  45.    return 0;
  46. }
  47.  

Saluditos!. .... ..(http://st.forocoches.com/foro/images/smilies/ciao.gif)


Título: Re: Problema con contador de palabra en C
Publicado por: Blaster en 31 Mayo 2013, 17:53 pm
leosansan me podrias indicar los errores que hay en el ultimo codigo que postee
ya no lo puedo ver te lo agradeceria mucho excelente los codigos que posteaste

Saludos  :rolleyes:


Título: Re: Problema con contador de palabra en C
Publicado por: xiruko en 31 Mayo 2013, 22:40 pm
Prueba con:

Código
  1. char frase[] = "Hola como estas Hola como te va Hola amigo";
  2. char *p = frase;

Y haz con 'p' todo lo que hacías con 'frase'.

Saludos.


Título: Re: Problema con contador de palabra en C
Publicado por: leosansan en 31 Mayo 2013, 23:14 pm

    int i, j = 0;
Código
  1.    do{
  2.  
  3.        while(frase[i]!= '32')
  4.        {
  5.           ......................................................................

Perdona que no haya mirado mucho el código, pero de entrada tienes un despiste mortal de necesidad, no has inicializado la variable i y a partir de ahí paré de mirar, sorry. Cuando pille más tiempo lo miraré más detalladamente.

Saluditos! ... ..
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con contador de palabra en C
Publicado por: xiruko en 31 Mayo 2013, 23:38 pm
Perdona que no haya mirado mucho el código, pero de entrada tienes un despiste mortal de necesidad, no has inicializado la variable i y a partir de ahí paré de mirar, sorry. Cuando pille más tiempo lo miraré más detalladamente.

De hecho en esta misma línea que comentas:

Citar
while(frase!= '32')

O bien pones esto:
Código:
while(frase[i]!= 32)

O bien pones esto:
Código:
while(frase[i]!= ' ')

Saludos!


Título: Re: Problema con contador de palabra en C
Publicado por: daryo en 31 Mayo 2013, 23:48 pm
bue ya que postee mire tu code

Código
  1. frase++;
no es la forma correcta de recorrer los arrays esto puede funcionar con una variable numerica pero no con una cadena.

supongo que intentas moverse un caracter pero lo que haces es en caso de ser variable numerica sumarle uno

para recorrer un array es asi
Código
  1. char cadena[2];
  2.  
  3. for (int num=0;num<2;num++)
  4. {
  5. cadena[num];
  6. }
  7.  


Título: Re: Problema con contador de palabra en C
Publicado por: Blaster en 1 Junio 2013, 00:55 am
Perdona que no haya mirado mucho el código, pero de entrada tienes un despiste mortal de necesidad, no has inicializado la variable i y a partir de ahí paré de mirar, sorry. Cuando pille más tiempo lo miraré más detalladamente.
Ufff mira lo que se me ha escapado lo correji pero sigue sin funcionar

Por que al hacerlo de esta forma corre de marravilla lo vi en otro foro

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define blanco(x) ((x) == ' ')
  5. int repeticion(const char *frase, const char *palabra, const int cant);
  6. int main()
  7. {
  8.    char frase[] = "Hola como estas Hola como te va Hola amigo";
  9.    char palabra[] = "Hola";
  10.  
  11.    int cant = strlen(palabra);
  12.    int veces = repeticion(frase, palabra, cant);
  13.  
  14.    printf("La palabra Hola se repite %d veces", veces);
  15.  
  16.    return 0;
  17.  
  18. }
  19. int repeticion(const char *frase, const char *palabra, const int cant)
  20. {
  21.    int i, j = 0;
  22.  
  23.    while(*frase != '\0' ){
  24.        i = 0;
  25.        while(!blanco(*frase) && *frase != '\0'){
  26.            frase++;
  27.            i++;
  28.        }
  29.        if(i == cant && strncmp(frase - cant, palabra, cant)==0) j++;
  30.  
  31.        if(*frase != '\0' )
  32.           frase++;
  33.    }
  34.    return j;
  35. }
  36.  

xiruko y daryo la verdad ya he probado mil forma ya se me acabaron las ideas
esto, esta por volverme loco

Saludos



Título: Re: Problema con contador de palabra en C
Publicado por: CCross en 1 Junio 2013, 04:53 am
Alguien me puede echar una mano con este codigo que no me compila me tira este error:
Código
  1. error: lvalue required as increment operand

lvalue generalmente se refiere a el valor a la izquierda de un operador de asignación = la expresion frase++ es equivalente a frase = frase + 1 basicamente frase es un tipo de puntero constante no puede cambiar su valor, que apunta al primer elemento de frase, con esa expresión tu intentas cambiar la dirección de frase que no es posible por eso el error del compilador, simplemente debes declarar un puntero a frase seria asi

Código
  1. char *ptr = frase; ptr++

Y aqui dejo otra forma de hacerlo, haciendo uso de la función strtok:

Código
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.  char frase[]= "Hola como estas Hola como te va Hola amigo";
  9.  char palabra[] = "Hola", *ptr;
  10.  int i = 0;
  11.  
  12.  ptr = strtok(frase, " ");
  13.  while(ptr != NULL)
  14.  {
  15.      if(strcmp(ptr, palabra)==0) i++;
  16.      ptr = strtok(NULL, " ");
  17.   }
  18.  cout << "La palabra Hola se repite: " << i << " veces" << endl;
  19.  
  20.  return 0;
  21. }
  22.  

Saludos   ;)




Título: Re: Problema con contador de palabra en C
Publicado por: leosansan en 1 Junio 2013, 17:56 pm
Hola he intentado hacerlo de esta forma pero sigue sin funcionar este me compila
pero al ejecutarlo me indica que mi programa quiere leer una area de memoria que
no esta disponible como puedo correjirlo

Veamos por qué no te funciona:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.    char frase[] = "Hola como estas Hola como te va Hola amigo";
  8.    char palabra[] = { "Hola" }, auxiliar[10]={0};/*==error, las llaves están de más*/
  9.  
  10.    int lon = strlen(palabra);/*<==esto no sirve de nada*/
  11.  
  12.    int i, j = 0;/*<==no inicializas la variable i a cero, error fundamental*/
  13.  
  14.    do{
  15.  
  16.        while(frase[i] != '32')/*<==debería ser: =32 o ='0' e incluir  
  17. el llegar al final de la cadena, si no entras en un bucle por el
  18. incremento posterior de i */
  19.        {
  20.            auxiliar[i] = frase[i];/*<== error en el índice de la variable
  21. auxiliar, que llamaré k, debe ser independiente de i y cada vez que
  22.  inicie una nueva palabra esté a cero*/
  23.            i++;/*<==aquí también habría que incrementar el índice de k*/
  24.        }
  25.        auxiliar[i]='\0';/*<==deberia ser auxiliar[k]='\0' y como
  26. empezariamos con una nueva variable, se vuelve a inicializar el índice k a cero*/
  27.        if(i == lon && strcmp(auxiliar, palabra) == 0)/*<==sobra lo de
  28.  lon, sencillamente se compara la variable auxiliar con palabr, la
  29.  longitud es lo de  menos, serán iguales o no, simplemente*/
  30.          j++;
  31.  
  32.          if(frase[i] != '\0')/*<==esto sobra ya que hemos tenido en
  33. cuenta este hecho en el while*/
  34.            i++;
  35. /*<==aquí falta limpiar la variable auxiliar, es decir que no contenga
  36.  nada, para volver a rellenarla en el while*/
  37.    }while(frase[i] != '\0');
  38.  
  39.    printf("La palabra Hola se repite %d veces", j);
  40.  
  41.    return 0;
  42. }
  43.  
  44.  

El código corregido es:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.    char frase[] = "Hola como estas Hola como te va Hola amigo";
  8.    char palabra[] = "Hola" , auxiliar[10]={0}, auxiliar0[10]={0};
  9.    int i = 0, j = 0,k = 0;
  10.    do{
  11.        while(frase[i] != ' ' && frase[i] != '\0')
  12.        {
  13.            auxiliar[k] = frase[i];
  14.            i++;k++;
  15.        }
  16.        auxiliar[k]='\0';
  17.        k=0;
  18.        i++;
  19.        if(strcmp(auxiliar, palabra) == 0)
  20.          j++;
  21.        strcpy(auxiliar,auxiliar0);
  22.        }while(frase[i] != '\0');
  23.    printf("La palabra Hola se repite %d veces", j);
  24.    return 0;
  25. }
  26.  

Saluditos!. ... ..
(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/lion14peque_zps1d213b80.jpg)


Título: Re: Problema con contador de palabra en C
Publicado por: Blaster en 1 Junio 2013, 19:04 pm
leosansan agradezco la valiosa ayuda de tu parte gracias por corregirme el codigo y el explicarme donde estaba fallando tengo una ultima consulta al respecto del codigo que posteaste seria este

Código
  1.  /************ otra forma************/
  2.   char *p;
  3.    i=0;
  4.  
  5.    for (p = frase; (p = strstr(p, "Hola")) != NULL; p += 2)
  6.        i++;
  7.    printf("La palabra %s se repite %d veces con strstr.\n",palabra, j);

No entiendo lo de la acción p+= 2; que hace esto, si no es molestia

lvalue generalmente se refiere a el valor a la izquierda de un operador de asignación = la expresion frase++ es equivalente a frase = frase + 1 basicamente frase es un tipo de puntero constante no puede cambiar su valor, que apunta al primer elemento de frase, con esa expresión tu intentas cambiar la dirección de frase que no es posible por eso el error del compilador, simplemente debes declarar un puntero a frase seria asi

CCross me gusto mucho tu codigo no sabia eso de strtok, agradezco la explicacion
que me brindaste me sirvio mucho

Saludos  ;D


Título: Re: Problema con contador de palabra en C
Publicado por: rir3760 en 1 Junio 2013, 20:35 pm
El código corregido es ...
Dos comentarios sobre tu programa:

1) No se puede incrementar de forma incondicional el contador "i" ya que en el caso de la ultima palabra su delimitador es '\0'. Para explicarlo mejor (con un ejemplo) revisa el funcionamiento del programa cambiando la cadena a procesar a:
Código
  1. char frase[] = "Hola\0como\0estas\0Hola\0como\0te\0va\0Hola\0amigo";

2) No es necesario poner a cero todos los caracteres del array "auxiliar" vía strcpy, con asignar '\0' al primero basta.

Un saludo


Título: Re: Problema con contador de palabra en C
Publicado por: leosansan en 1 Junio 2013, 22:23 pm
Dos comentarios sobre tu programa:

1) No se puede incrementar de forma incondicional el contador "i" ya que en el caso de la ultima palabra su delimitador es '\0'. Para explicarlo mejor (con un ejemplo) revisa el funcionamiento del programa cambiando la cadena a procesar a:
Código
  1. char frase[] = "Hola\0como\0estas\0Hola\0como\0te\0va\0Hola\0amigo";

2) No es necesario poner a cero todos los caracteres del array "auxiliar" vía strcpy, con asignar '\0' al primero basta.

Un saludo


En cuanto a lo segundo totalmente de acuerdo, no está mal pero es una redundancia el uso de strcpy como has indicado.

Respecto a lo primero, el que en la cadena estuviera el \0, no me lo plantee porque no era el caso en cuestión. La cadena era la que era y se trataba de explicar el por qué no  le funcionaba, cosa que dentro de mis modestísimos conocimientos traté de hacer con resultados, a mi entender, aceptables, más cuando nadie parecía interesado en darle una explicación o por falta de tiempo, interés  o ganas.

Vamos, que si la cuestión hubiera sido analizar una cadena genérica entrada por teclado, en lugar  de la indicada por el código, el planteamiento habría variado.

Como resumen de lo expuesto, teniendo en cuenta también lo aportado por CCros:


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.    char frase[] = "Hola como estas Hola como te va Hola amigo";
  7.    char palabra[] =  "Hola" , aux[10]={0},aux0[10]="";
  8.    int i=0, j = 0;
  9.  
  10.    do
  11.    {
  12.        if(frase[i]=='H' && frase[i+3]=='a')
  13.            j++;
  14.        i++;
  15.    }while(frase[i] != '\0');
  16.    printf("La palabra %s se repite %d veces con do-while.\n" , palabra, j);
  17.  
  18.    /************ otra forma************/
  19.  
  20.   char *p;
  21.    i=0;
  22.    for (p = frase; (p = strstr(p, "Hola")) != NULL; p += 2)
  23.        i++;
  24.    printf("La palabra %s se repite %d veces con strstr.\n",palabra, j);
  25.  
  26.    /************ otra forma************/
  27.  
  28.    int k=0;
  29.    i=0, j = 0;
  30.    for (i=0;frase[i] != '\0' ;i++)
  31.    {
  32.        if (frase[i] != ' ')
  33.            aux[k] = frase[i];
  34.        k++;
  35.        if (frase[i] == ' ')
  36.        {
  37.            aux[k-1]='\0';
  38.            k=0;
  39.            if (strcmp (palabra,aux)==0)
  40.                j++;
  41.            aux[k]='\0';
  42.        }
  43.    }
  44.     printf("La palabra %s se repite %d veces con strcmp.", palabra,j);
  45.  
  46.    /************ otra forma************/
  47.  
  48.     i = 0, j = 0,k = 0;
  49.    do{
  50.        while(frase[i] != ' ' && frase[i] != '\0')
  51.        {
  52.            aux[k] = frase[i];
  53.            i++;k++;
  54.        }
  55.        aux[k]='\0';
  56.        k=0;
  57.        i++;
  58.        if(strcmp(aux, palabra) == 0)
  59.          j++;
  60.        aux[k]='\0';
  61.        }while(frase[i] != '\0');
  62.  
  63.    printf("\nLa palabra Hola se repite %d veces con do-while y strcmp.", j);
  64.  
  65.    /************ otra forma************/
  66.  
  67.    char *ptr;
  68.    i = 0;
  69.    ptr = strtok(frase, " ");
  70.    while(ptr != NULL)
  71.    {
  72.        if(strcmp(ptr, palabra)==0)
  73.            i++;
  74.            ptr = strtok(NULL, " ");
  75.    }
  76.    printf ("\nLa palabra Hola se repite %d veces con strtok.", j);
  77.    return 0;
  78. }
  79.  
  80.  

Como siempre, gracias por tus aportaciones de las que no paro de aprender.

Saluditos! ... ..
(http://st.forocoches.com/foro/images/smilies/ciao.gif)


Título: Re: Problema con contador de palabra en C
Publicado por: rir3760 en 2 Junio 2013, 16:48 pm
Cita de: rir3760
) No se puede incrementar de forma incondicional el contador "i" ya que en el caso de la ultima palabra su delimitador es '\0'.
Respecto a lo primero, el que en la cadena estuviera el \0, no me lo plantee porque no era el caso en cuestión. La cadena era la que era y se trataba de explicar el por qué no  le funcionaba, cosa que dentro de mis modestísimos conocimientos traté de hacer con resultados, a mi entender, aceptables, más cuando nadie parecía interesado en darle una explicación o por falta de tiempo, interés  o ganas.

Vamos, que si la cuestión hubiera sido analizar una cadena genérica entrada por teclado, en lugar  de la indicada por el código, el planteamiento habría variado.
Por lo visto no lo pude explicar bien, déjame intentarlo de nuevo.

En tu programa dentro del bucle interno:
Código
  1. do{
  2.   while(frase[i] != ' ' && frase[i] != '\0'){
  3.      auxiliar[k] = frase[i];
  4.      i++;k++;
  5.   }
Buscas el carácter delimitador de la palabra a procesar, este sera un espacio salvo el caso de la ultima palabra. Con esta es el '\0' y se ubica en la posición "frase[ i ]".

Cuando se procesa la ultima palabra al incrementar incondicionalmente el contador con "i++" tenemos que "frase[ i ]" indicara un carácter que no es parte de la cadena a procesar. En otras palabras el bucle solo terminara cuando encuentre dos bytes continuos con el valor '\0'.

En mi caso (no tengo disponibles los documentos para ver el tema de alineación) si modifico el programa para tener cadenas contiguas:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.   char test[][43] = {
  8.      "Hola como estas Hola como te va Hola amigo",
  9.      "Hola como estas Hola como te va Hola amigo",
  10.      "Hola como estas Hola como te va Hola amigo",
  11.      "Hola como estas Hola como te va Hola amigo",
  12.      "Hola como estas Hola como te va Hola amigo"
  13.   };
  14.   char palabra[] = "Hola" , auxiliar[10]={0}, auxiliar0[10]={0};
  15.   int i = 0, j = 0,k = 0;
  16.   char *frase = test[0];
  17.  
  18.   do{
  19.      while(frase[i] != ' ' && frase[i] != '\0'){
  20.         auxiliar[k] = frase[i];
  21.         i++;k++;
  22.      }
  23.      auxiliar[k]='\0';
  24.      k=0;
  25.      i++;
  26.      if(strcmp(auxiliar, palabra) == 0)
  27.         j++;
  28.      strcpy(auxiliar,auxiliar0);
  29.   }while(frase[i] != '\0');
  30.   printf("La palabra Hola se repite %d veces\n", j);
  31.   return 0;
  32. }
El programa reporta que "Hola" se repite quince veces.

Espero todo esto se tome como una critica constructiva.

Un saludo


Título: Re: Problema con contador de palabra en C
Publicado por: leosansan en 2 Junio 2013, 17:08 pm

Por lo visto no lo pude explicar bien, déjame intentarlo de nuevo.
.................................................
Espero todo esto se tome como una critica constructiva.

Un saludo

Quien se explico mal debí ser yo. El código que planteé era para la cadena concreta que había planteado mcKicrO, no para un caso más general. De todas formas acepto con toda humildad la observación.

Y respecto de lo segundo, que te voy a decir. Todo lo que viene de ti lo meto en un fichero denominado consejos_rir, y no es coña marinera. Alucino con tu control del/los lenguajes C/C++. Pienso que es una suerte tener a alguien de tu preparación aconsejándonos a los noveles como yo.

Un fuerte saludo amigo rir!. .....
(http://st.forocoches.com/foro/images/smilies/ciao.gif)