Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)

Iniciado por NOB2014, 5 Agosto 2014, 19:35 PM

0 Miembros y 4 Visitantes están viendo este tema.

NOB2014

Hola a todos.
Me pase con este tema unas cuantas horas y hasta aquí llegue, espero que me puedan ayudar a resolverlo.-

En primer lugar les pongo el enunciado.


Lo que llevo hecho es lo siguiente.

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

int main(void){
char tempFrase[] = "La casa de Juan es de color azul", *token, frase[32];
int ocurrencias=0;

strcpy(frase, tempFrase);

token = strtok(tempFrase," ");
while (token != NULL){
printf("\n En la direccion %p se encuentra la palabra...: %s\n", token ,token);
(strlen(token) == 4) ? ocurrencias++ : ocurrencias;
token = strtok(NULL," ");
}

printf("\n La frase \"%s\" contiene %d palabras de 4 letras\n\n", frase, ocurrencias);

return 0;
}



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

#define MAX_FRASES 5
#define MAX_LONGITUD 30

void verificaIngreso(char frases[][MAX_LONGITUD], int i);

int main(void){
char frases[MAX_FRASES][MAX_LONGITUD];
int i=0, j=0, ocurrencias=0, com=0, fin=0;

for(; i<MAX_FRASES; i++){
printf("\n Ingrece frase[%d]...:", i+1);
fgets(frases[i], MAX_LONGITUD, stdin);
verificaIngreso(frases, i);
}

for(i=0; i<MAX_FRASES; i++){
printf("\n La frase[%d] tiene una longitud de %d caracteres", i+1,  strlen(frases[i]));
}

for(i=0; i<MAX_FRASES; i++){
for(j=0; frases[i][j]; j++){
if(frases[i][j] == 32)
com = frases[j]

}
}

printf("\n %d", espacios);
printf("\n\n");
return 0;
}

void verificaIngreso(char frases[][MAX_LONGITUD], int i){
char *p=NULL;
unsigned int ch=0;

if((p=strchr(frases[i], '\n'))!=0){
*p='\0';
}
else{
while((ch = getchar()) !='\n' && ch!=EOF);
}

}*/


Lo que no puedo saber es ¿Qué referencia debo utilizar para acceder a la variable frase y sustituir todas las palabras de 4 letras con asteriscos ?.- 

Saludos y desde ya muchas gracias por el tiempo.-
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan

Teniendo en cuenta que pueden haber varios espacios en blanco seguidos y haciendo el bestia, sin usar las funciones propias para estos efectos, propongo:

Código (cpp) [Seleccionar]
********************************************************

char frase [  ] = "1234   789 1234 321  9876 56 " ;
  for ( i = 0 ; frase [ i ] ; i++  ) {
    if ( frase [ i ] != ' ' )
      j++ ;
    if ( frase [ i ] == ' ' ) {
      if ( j == 4 ){
        cont++ ;
        for ( k = i - 1 ; k >= i - 4  ; k-- )
          frase [ k ] = '*' ;
      }

    j = 0 ;
    }
  }
  printf ( "\n\nLa frase final es: %s" , frase ) ;
  printf ( "\n\nY contiene %d palabras de cuatro letras.\n\n" , cont ) ;

*******************************************************


¡¡¡¡ Saluditos! ..... !!!!



NOB2014

Hola Leo.
Gracias "viejo" amigo por responder, corrí tú código y me dio el mismo error que a la mayoría, si la última palabra tiene 4 letras y no tiene un espacio entre la última letra y el '\0' no la sustituye.-
Bueno dejo mi versión.-   

#include <stdio.h>

int main(void){
char s1[] = "hola Daniel como estas? Soy Pino1952 pero tambien Daniel o Dany chao";
int i=0, cont=0, cant=0;

printf("\n cadena original....: %s\n", s1);
for(; s1[i]; i++){
cont++;
if(s1[i] == ' '){
if(cont==5){
for(cont=i-4; cont <i; cont++){
s1[cont] = '*';
}
cant++;
}
cont=0;
}
}
if(cont==4){
for(cont=i-4; cont <i; cont++){
s1[cont] = '*';
}
cant++;
}

printf("\n Cadena reemplazada.: %s\n", s1);
printf("\n Se han sustituido un total de %d palabras.\n\n", cant);

return 0;
}


Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

leosansan

#3
Cita de: NOB2014 en  6 Agosto 2014, 16:17 PM
Hola Leo.
Gracias "viejo" amigo por responder, corrí tú código y me dio el mismo error que a la mayoría, si la última palabra tiene 4 letras y no tiene un espacio entre la última letra y el '\0' no la sustituye.-
Bueno dejo mi versión.-  

Saludos.
Daniel


¡¡¡ Un placer volver a verte por aquí !!!, amigo Daniel.

Ya ves que las prisas y el no testear a fondo un código tiene a veces esas consecuencias.

En realidad, y creo que como bien has observado, faltaba "la última comprobación", los cuatro últimos caracteres. Paso mi código con esa corrección:

Código (cpp) [Seleccionar]
************************************************
 char frase [  ] = "1234   789 1234 321  9876 5678" ;
  frase [ strlen ( frase ) ] =' ' ;
  for ( i = 0 ; i < strlen( frase ) - 1 ; i++  ) {
    if ( frase [ i ] != ' ' )
      j++ ;
    else if ( frase [ i ] == ' '  ) {
      if ( j == 4 ){
        cont++ ;
        for ( k = i - 1 ; k >= i - 4  ; k-- )
          frase [ k ] = '*' ;
      }
    j = 0 ;
    }
  }
  frase [ i ] = '\0' ;
  printf ( "\n\nLa frase final es: %s" , frase ) ;
  printf ( "\n\nY contiene %d palabras de cuatro letras.\n\n" , cont ) ;
*******************************************************


Y lo dicho, un placer el volver a encontrarte, y espero que sea más a menudo ¡¡¡Campeón!!!!. ;) ;) ;)

EDITADO para hacer uso de strlen y abreviar.

¡¡¡¡ Saluditos! ..... !!!!



Blaster

#4
Otra forma, usando la función strchr:

Editado:

Código (cpp) [Seleccionar]
char s1[] = " 1234 789  1234 321   9876 5678 ";
   
for( i = 0, j = 0; s1[ i ] != '\0'; i++, j++ )
{
    if( strchr( " \0", s1[i + 1] ) && j == 3 )
    {
       for( j = i - 3; j <= i; j++ )
            s1[ j ] = '*';
       cant++, j = 0;
    }
    s1[i + 1] == ' ' ? (j = -2) : ( s1[ i ] == ' ' && i == 0 )
    ? (j = -1) : (j = j);
}
printf("\n Cadena reemplazada.: %s\n", s1);
printf("\n Se han sustituido un total de %d palabras.\n\n", cant);


Saludos

leosansan

Cita de: Blaster en  6 Agosto 2014, 20:58 PM
Otra forma, usando la función strchr:
..............................
Saludos

¿Pero no quedamos en que íbamos a implementar nuestras propias funciones?  :laugh:

Es broma.

Está muy bien pero a mí me falla, y ya lo digo con miedo a equivocarme, porque si el primer espacio es un espace  y la primera cadena es de cuatro no la cambia por asteriscos:

Código (cpp) [Seleccionar]


Cadena original.:  1234   789 1234 321  9876 5678

Cadena reemplazada.:  1234   789 **** 321  **** ****

Se han sustituido un total de 3 palabras.

Process returned 0 (0x0)   execution time : 0.025 s
Press any key to continue.



¡¡¡¡ Saluditos! ..... !!!!



Blaster

#6
Cita de: leosansan en  7 Agosto 2014, 00:59 AM
Está muy bien pero a mí me falla, y ya lo digo con miedo a equivocarme, porque si el primer espacio es un espace  y la primera cadena es de cuatro no la cambia por asteriscos:

Inconveniente solventado ahora va de maravilla edite el código de arriba 

Saludos

leosansan

#7
Cita de: Blaster en  7 Agosto 2014, 04:28 AM
Inconveniente solventado ahora va de maravilla edite el código de arriba  

Saludos

Perfecto, ahora va como la seda.  ;-) ;-)

Y con una línea más a cambio de no usar función alguna:

Código (cpp) [Seleccionar]
***************************************************

 char frase [ ] = "1234  23789 1234 321  9876 5679";
  for( i = 0;  frase [ i ]; i++  ){
    iNoEspacio = ( frase [ i ] !=  ' ' ) ?  iNoEspacio + 1 : 0 ;
    if ( iNoEspacio == 4  && ( frase [ i+1 ] ==  ' ' || frase [ i+1 ]==  '\0') ) {
      for ( k = i  ; k >= i - 3  ; k-- ){
        frase [ k ] = '*'  ;
      }
    iNoEspacio = 0 , cont++ ;
    }
  }

**********************************************************


Espero que esto nos sirva a todos  para que ver que soluciones "haberlas haylas " y que tan sólo es cuestión del momento que salga una a bote pronto pero hay que analizar las distintas opciones en busca de la más eficiente.  ;)

¡¡¡¡ Saluditos! ..... !!!!



Blaster

Cita de: leosansan en  7 Agosto 2014, 16:34 PM
Y con una línea más a cambio de no usar función alguna:

Va bien pero no tiene en cuenta si la ultima palabra es de cuatro caracteres y no tiene un espacio entre el ultimo carácter y el carácter nulo

Saludos

leosansan

#9
Cita de: Blaster en  7 Agosto 2014, 16:51 PM
Va bien pero no tiene en cuenta si la ultima palabra es de cuatro caracteres y no tiene un espacio entre el ultimo carácter y el carácter nulo

Saludos
Pues a corregirlo.  ;)

EDITO:

Es que ese caracter nulo  ;D:

Edité el mensaje anterior, pero lo que modifiqué fue la línea:

Código (cpp) [Seleccionar]
if ( iNoEspacio == 4  && ( frase [ i+1 ] ==  ' ' || frase [ i+1 ]==  '\0') )

para tener en cuenta al nulo.  ;-)