elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)  (Leído 11,402 veces)
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)
« Respuesta #10 en: 7 Agosto 2014, 19:01 pm »

Es que ese caracter nulo  ;D:

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

Código
  1. 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


En línea

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

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)
« Respuesta #11 en: 7 Agosto 2014, 21:31 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
  1. char s1[] = " 1234 78   12345 321  9876 5678 ";
  2. int pos = 0;
  3.  
  4. for (i = 0; s1[ i ] != '\0'; i += pos + 1)
  5.   if (((pos = strcspn( s1 + i, " " )) == 4 &&
  6.       s1[ i - 1 ] == ' ') || (s1[4] == ' ' && i == 0))
  7.     memset( s1 + i, '*', 4 ), cont++;
  8.  
  9. printf("\n Cadena reemplazada.: %s\n", s1);
  10. printf("\n Se han sustituido un total de %d palabras.\n\n", cont);
  11.  

Saludos


« Última modificación: 8 Agosto 2014, 03:25 am por Blaster » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)
« Respuesta #12 en: 7 Agosto 2014, 22:46 pm »

Me gusto la idea de rir3760 la implemente de esta manera:
......................................................................
  
Código
  1. else if (s1[ i + 4 ] == ' ' && i == 0)
  2.      memset( s1 + i, '*', 4 ),
  3.      cont++;
..................................................

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

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

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

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

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


En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)
« Respuesta #13 en: 7 Agosto 2014, 22:55 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
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)
« Respuesta #14 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, 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.
En línea

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


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)
« Respuesta #15 en: 8 Agosto 2014, 05:59 am »

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á.


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
  1. ***************************************************
  2.  
  3. char frase[] = "123456  23789 1234 3213  986   5679";
  4.  
  5.  for( i = 0 ;  frase [ i ] ; i++  )
  6.    if ( ( iNoEspacio = ( frase [ i ] !=  ' ' ) ?  iNoEspacio + 1 : 0 ) == 4  && ( frase [ i + 1 ] ==  ' ' || frase [ i + 1 ] ==  '\0') )
  7.      memset ( frase + i - 3 , '*' , 4 ) , cont++ ;
  8.  
  9.  printf( "\n    Cadena final.: %s\n\nY contiene %d palabras de cuatro letras.\n\n\n" , frase, cont) ;
  10.  
  11. **********************************************************

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.

..........................................................................................
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! ..... !!!!


En línea

Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)
« Respuesta #16 en: 8 Agosto 2014, 16:14 pm »

Nueva versión la deje de la siguiente manera:

Código
  1. char s1[] = " 1234 78   12345 321  9876 5678 ";
  2. int pos = 0;
  3.  
  4. for (i = 0; s1[ i ] != '\0'; i += pos + 1)
  5.   if ((pos = strcspn(s1 + i, " ")) == 4 && strchr(" \0", s1[i+pos]))
  6.      memset( s1 + i, '*', 4 ), cont ++;
  7.  
  8. printf("\n Cadena reemplazada.: %s\n", s1);
  9. 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
« Última modificación: 9 Agosto 2014, 00:00 am por Blaster » En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines