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

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

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

rir3760

Cita de: leosansan en  7 Agosto 2014, 17:21 PMEs 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.  ;-)
Es mejor mantenerse con la versión con centinela ya que a cambio de dos asignaciones fuera del bucle te ahorras la comparación dentro de este.

Otra alternativa consiste en utilizar la función strcspn para encontrar el siguiente carácter igual a ' ' o '\0' y la función memset para imprimir los cuatro espacios (los prototipos de ambas en <string.h>).

Un saludo
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

Blaster

#11
Cita de: rir3760 en  7 Agosto 2014, 19:01 PM
Otra alternativa consiste en utilizar la función strcspn para encontrar el siguiente carácter igual a ' ' o '\0' y la función memset para imprimir los cuatro espacios (los prototipos de ambas en <string.h>).

Me gusto la idea de rir3760 la implemente de esta manera:

Código (cpp) [Seleccionar]
char s1[] = " 1234 78   12345 321  9876 5678 ";
int pos = 0;

for (i = 0; s1[ i ] != '\0'; i += pos + 1)
  if (((pos = strcspn( s1 + i, " " )) == 4 &&
      s1[ i - 1 ] == ' ') || (s1[4] == ' ' && i == 0))
    memset( s1 + i, '*', 4 ), cont++;

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


Saludos

leosansan

Cita de: Blaster en  7 Agosto 2014, 21:31 PM
Me gusto la idea de rir3760 la implemente de esta manera:
......................................................................
 
Código (cpp) [Seleccionar]
else if (s1[ i + 4 ] == ' ' && i == 0)
     memset( s1 + i, '*', 4 ),
     cont++;

..................................................

......................................................................

Sólo que el else-if está exclusivamente para el la posible primera palabra y podría ser más propio:

Código (cpp) [Seleccionar]
else if (s1[ 4 ] == ' ' )
      memset( s1 + 0, '*', 4 ),cont++;


Peo al César lo que es del César, lo has bordado.  ;)

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



Blaster

Cita de: leosansan en  7 Agosto 2014, 22:46 PM
Sólo que el else-if está exclusivamente para el la posible primera palabra y podría ser más propio:

Es cierto leosansan no me había fijado, gracias por la observación  ;)

Saludos

NOB2014

Hola a todos.
Me gusta esta triada, rir3760 la idea, Blaster la materializa y Leo el vigilador, observador, corregidor, muy interesante el código de Blaster, realmente no creo que se pueda hacer con menos líneas y como soy un apasionado de los códigos concisos, muchos aplausos para los tres.-  ;-) ;-) ;-)
Yo tengo mi última versión pero ante esto realmente da vergüenza, el lacayo se rinde a vuestros pies.- :-X
Después de esto tengo que implementar un programa con números mágicos, si no lo logro por mi cuenta les pediré ayuda.-     

Saludos y un gran abrazo.
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

Cita de: rir3760 en  7 Agosto 2014, 19:01 PM
Es mejor mantenerse con la versión con centinela ya que a cambio de dos asignaciones fuera del bucle te ahorras la comparación dentro de este.
............................................................................................

Estaré "espeso" pero no veo que me salga del array, en todo caso veo que llego al caracter nulo pero no más allá.

Cita de: rir3760 en  7 Agosto 2014, 19:01 PM

Otra alternativa consiste en utilizar la función strcspn para encontrar el siguiente carácter igual a ' ' o '\0' y la función memset para imprimir los cuatro espacios (los prototipos de ambas en <string.h>).


Por cosa como esas es por lo que te echaba de menos últimamente "maestro".  ;-)

Como Blaster se me adelantó, mi propuesta es una "mezcla, uso memset para copiar los asteriscos y sigo usando mi propia "strcspn" y con el mismo y escueto número de líneas:

Código (cpp) [Seleccionar]
***************************************************
 
char frase[] = "123456  23789 1234 3213  986   5679";

  for( i = 0 ;  frase [ i ] ; i++  )
    if ( ( iNoEspacio = ( frase [ i ] !=  ' ' ) ?  iNoEspacio + 1 : 0 ) == 4  && ( frase [ i + 1 ] ==  ' ' || frase [ i + 1 ] ==  '\0') )
      memset ( frase + i - 3 , '*' , 4 ) , cont++ ;

  printf( "\n    Cadena final.: %s\n\nY contiene %d palabras de cuatro letras.\n\n\n" , frase, cont) ;

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


Cita de: NOB2014 en  8 Agosto 2014, 04:38 AM
Hola a todos.
Me gusta esta triada, rir3760 la idea, Blaster la materializa y Leo el vigilador, observador, corregidor
..........................................................................................

Gracias a tí Daniel por querer compartir conocimientos y, como no, a Blaster y rir3760 por los "bellos" aportes que han realizado y el espíritu de sana competencia que nos lleva a enriquecernos a todos, al menos intelectualmente.

Y sí, creo que entre todos los usuarios de este foro formamos un buen equipo, y eso que he echado de menos a eferion y vangdop, etc.... y al ya lejano amchacon. Esto último sí que me duele, espero que se anime y vuelva por este foro.

Cita de: NOB2014 en  8 Agosto 2014, 04:38 AM
..........................................................................................
Después de esto tengo que implementar un programa con números mágicos, si no lo logro por mi cuenta les pediré ayuda.-     
............................................................................................

Eso me alegra de manera especial ya que yo soy más de números que, como este tema, de letras. Esperaremos impacientes tus aportes y/o dudas al respecto.

Un fuerte abrazo, campeón.

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



Blaster

#16
Nueva versión la deje de la siguiente manera:

Código (cpp) [Seleccionar]
char s1[] = " 1234 78   12345 321  9876 5678 ";
int pos = 0;

for (i = 0; s1[ i ] != '\0'; i += pos + 1)
  if ((pos = strcspn(s1 + i, " ")) == 4 && strchr(" \0", s1[i+pos]))
     memset( s1 + i, '*', 4 ), cont ++;

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


No me gustaba lo de restarle uno  ;)

EDITO:

Creo es mejor conservar la versión anterior, ya que encontré que esta es
propensa a hacer comparaciones fuera del buffer al pasarle una cadena como esta
"2510 2"

REEDITÓ:

Ahora va perfecto

Saludos