Autor
|
Tema: Sustituir cada palabra de 4 letras con asteriscos(lenguaje c) (Leído 16,743 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 s Press 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,085
|
15 Febrero 2011, 14:57 pm
por DeSsy
|
|
|
Letras desordenadas, para formar palabra.
Desafíos - Wargames
|
Pox1
|
3
|
14,094
|
23 Abril 2012, 01:53 am
por $Edu$
|
|
|
[Python] Ayuda! Quiero sustituir letras de un password por ****
Scripting
|
darkweb64
|
1
|
2,527
|
16 Febrero 2015, 20:49 pm
por darkweb64
|
|
|
Sintaxis REGEXP para sustituir una palabra x otra
Programación General
|
condotiero
|
2
|
2,667
|
19 Marzo 2015, 16:01 pm
por Eleкtro
|
|
|
Ordenar letras de una palabra en orden alfabetico
Programación C/C++
|
vivinice
|
1
|
10,253
|
20 Junio 2016, 17:16 pm
por AlbertoBSD
|
|