| 
	
		|  Autor | Tema: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c)  (Leído 18,051 veces) |  
	| 
			| 
					
						| NOB2014 
								 
								
								 Desconectado 
								Mensajes: 366
								
								   | 
 
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;  	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; 	} 	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
 
 |  
						| 
								|  |  
								|  |  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 
								Mensajes: 1.314
								
								
								
								
								
								   | 
 
Teniendo en cuenta que pueden haber varios espacios en blanco seguidos y haciendo el bestia , sin usar las funciones propias para estos efectos, propongo: ******************************************************** 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! ..... !!!!
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| NOB2014 
								 
								
								 Desconectado 
								Mensajes: 366
								
								   | 
 
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 |  
						| 
								|  |  
								|  |  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 
								Mensajes: 1.314
								
								
								
								
								
								   | 
 
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: ************************************************  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! ..... !!!! |  
						| 
								|  |  
								| « Última modificación:  7 Agosto 2014, 00:47 am por leosansan » |  En línea | 
 
 |  |  |  | 
			| 
					
						| Blaster 
								
								 Desconectado 
								Mensajes: 190
								
								
								
								
								
								   | 
 
Otra forma, usando la función strchr :Editado: 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 |  
						| 
								|  |  
								| « Última modificación:  7 Agosto 2014, 04:07 am por Blaster » |  En línea | 
 
 |  |  |  | 
			| 
					
						| leosansan 
								       
								
								 Desconectado 
								Mensajes: 1.314
								
								
								
								
								
								   | 
 
Otra forma, usando la función strchr:..............................
 Saludos
 
 ¿Pero no quedamos en que íbamos a implementar nuestras propias funciones?    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:   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 sPress any key to continue. 
 ¡¡¡¡ Saluditos! ..... !!!! |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Blaster 
								
								 Desconectado 
								Mensajes: 190
								
								
								
								
								
								   | 
 
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 |  
						| 
								|  |  
								| « Última modificación:  7 Agosto 2014, 04:37 am por Blaster » |  En línea | 
 
 |  |  |  | 
			| 
					
						| leosansan 
								       
								
								 Desconectado 
								Mensajes: 1.314
								
								
								
								
								
								   | 
 
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: ***************************************************   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! ..... !!!! |  
						| 
								|  |  
								| « Última modificación:  7 Agosto 2014, 17:39 pm por leosansan » |  En línea | 
 
 |  |  |  | 
			| 
					
						| Blaster 
								
								 Desconectado 
								Mensajes: 190
								
								
								
								
								
								   | 
 
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 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| leosansan 
								       
								
								 Desconectado 
								Mensajes: 1.314
								
								
								
								
								
								   | 
 
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    : Edité el mensaje anterior, pero lo que modifiqué fue la línea: if ( iNoEspacio == 4  && ( frase [ i+1 ] ==  ' ' || frase [ i+1 ]==  '\0') ) 
 para tener en cuenta al nulo.    |  
						| 
								|  |  
								| « Última modificación:  7 Agosto 2014, 17:39 pm por leosansan » |  En línea | 
 
 |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | [Ayuda] ¿Se puede revelar la palabra oculta sobre los asteriscos? Mensajería
 | DeSsy | 2 | 41,648 |  15 Febrero 2011, 14:57 pm por DeSsy
 |  
						|   |   | Letras desordenadas, para formar palabra. Desafíos - Wargames
 | Pox1 | 3 | 14,505 |  23 Abril 2012, 01:53 am por $Edu$
 |  
						|   |   | [Python] Ayuda! Quiero sustituir letras de un password por **** Python
 | darkweb64 | 1 | 2,994 |  16 Febrero 2015, 20:49 pm por darkweb64
 |  
						|   |   | Sintaxis REGEXP para sustituir una palabra x otra Programación General
 | condotiero | 2 | 3,185 |  19 Marzo 2015, 16:01 pm por Eleкtro
 |  
						|   |   | Ordenar letras de una palabra en orden alfabetico Programación C/C++
 | vivinice | 1 | 10,646 |  20 Junio 2016, 17:16 pm por AlbertoBSD
 |    |