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.
(http://i59.tinypic.com/124tys4.png)
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
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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/simba1.gif)
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
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:
************************************************
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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
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
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:
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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/simba2.gif)
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
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:
***************************************************
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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/simba1.gif)
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
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:
if ( iNoEspacio == 4 && ( frase [ i+1 ] == ' ' || frase [ i+1 ]== '\0') )
para tener en cuenta al nulo. ;-)
(http://st.forocoches.com/foro/images/smilies/simba1.gif)
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:
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
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:
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
Cita de: Blaster en 7 Agosto 2014, 21:31 PM
Me gusto la idea de rir3760 la implemente de esta manera:
......................................................................
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:
else if (s1[ 4 ] == ' ' )
memset( s1 + 0, '*', 4 ),cont++;
Peo al César lo que es del César, lo has bordado. ;)
¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/simba2.gif)
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
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.
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:
***************************************************
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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Nueva versión la deje de la siguiente manera:
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