Ayuda con programa

Iniciado por Cas980, 15 Marzo 2014, 06:03 AM

0 Miembros y 1 Visitante están viendo este tema.

Cas980

Necesito crear un programa que a partir de una frase la imprima por palabras pero sin usar la funcion strtok, tengo lo siguiente pero no logro que imprima. Espero me puedan ayudar.
Por ejemplo si la frase es "hoy es viernes"
debe imprimir:
hoy
es
viernes

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;


int mi_strtok(char* frase)
{
    int cont = 0;
    int x,c=0;
   
    while(*frase++ != '\0')
    {
       if(*frase!= ' ')
         {  
               
              cont++;
             
           }
       else
           {
               for(x=c;x<cont;x++)
               {
                  cout<<frase[x];
                  }
                  c=c+cont;
                 
               
           }
           
       }
           
    return 0;
}

main()
{
    char frase[500];
    cout<<"Ingrese la frase: ";
    gets(frase);  
    mi_strtok(frase);
   
    getch();

milx86

#1
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
void mi_strtok(char *frase);

int main(void) {
    char frase[100];
    cout<<"Ingrese la frase: ";
    gets(frase);
    mi_strtok(frase);
    getch();
    return 0;
}

void mi_strtok(char *frase)
{
    int i;
     for(i=0; frase[i]!='\0';i++)
     {
         if(frase[i]==' '){
             cout<<"\n";
             continue; //Saltar a la sgte iteración para que no imprima el espacio.
         }
         cout<<frase[i];

     }
}

Espero esto te sirva  :)
La abstracción es la clave para lidiar con la complejidad.

amchacon

Que manía tienen los profesores de mezclar C y C++.

Yo cambiaría:
Código (cpp) [Seleccionar]
cout<<"\n";

Por:
Código (cpp) [Seleccionar]
cout<<endl;

Ya que con endl se refresca el flujo de salida además.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

Cita de: amchacon en 15 Marzo 2014, 12:14 PM
Que manía tienen los profesores de mezclar C y C++.
....................................

Por no hablar de librerías innecesarias con el uso de funciones no recomendadas:

Código (cpp) [Seleccionar]

..............
#include <conio.h> <== No aconsejable por no ser estándar
#include <stdio.h> <== Sobraría usando cin.getline
...........................
gets(frase); <== No aconsejable, en su lugar, por ejemplo, usaría la que sigue
cin.getline(frase, 100, '\n');
.....................
getch(); <== No aconsejable por no ser estándar



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



milx86

Cita de: amchacon en 15 Marzo 2014, 12:14 PM
Que manía tienen los profesores de mezclar C y C++.
amchacon tienes razon, estoy iniciando la carrera de informatica y no puedo evitar el coraje cuando la maestra llama "C" a C++   :-( los consideran como iguales -.-
Y eso de "refrescar el flujo" no sabia, te agradezco :D

Cita de: leosansan en 15 Marzo 2014, 14:43 PM
Por no hablar de librerías innecesarias con el uso de funciones no recomendadas:

Código (cpp) [Seleccionar]

#include <conio.h> <== No aconsejable por no ser estándar

Seguro esta en windows, a mi me decian que le ponga el getch() para que no se me cierre el programa rapido :/
La abstracción es la clave para lidiar con la complejidad.

amchacon

Para eso tienes el cin.get()

Que además es estándar.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#6
Y porfi, la próxima vez elige en GeSHi las etiquetas de C++ para que el código salga coloreado y sea más fácil de visualizar.

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



Yoel Alejandro

Aunque no queda mucho que aportar aquí, la idea fundamental es que si se haya espacio imprimir en su lugar un '\n', de otro modo imprimir el carácter normal. Se puede mejorar un poco usando isspace() (requiere <ctype.h>) para que dicho reemplazo ocurra no sólo con ' ', sino con cualquier carácter de espacio (tabulador, etc).

Presento mi versión enteramente en C. Usa un modo seguro de ingreso de datos usando fgets() (controla la cantidad de caracteres que se ingresan) y atendiendo a la recomendación de leosansan su usa la función estándar getchar() en lugar de getch(). Su salida:

Intro frase: Anita lava la tina
Anita
lava
la
tina


Código (cpp) [Seleccionar]

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

void mi_strtok( char *frase );

int main( ) {

   char frase[101];

   printf("Intro frase: ");
   fflush( stdout );
   fgets(frase, 101, stdin);

   mi_strtok( frase );

   putchar('\n');
   return 0;
}

void mi_strtok( char *frase ) {

   int i;
   char c;

   i = 0;
   while ( ( c = frase[i++] ) != '\0' ) {
      if ( !isspace(c) )
         putchar(c);
      else
         putchar('\n');
   }
}
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

amchacon

#8
La función original no escribe en la pantalla ;D, sino que "fragmenta" una cadena en varios trozos.

Presento la mía que hace lo mismito que la strtok:
Código (cpp) [Seleccionar]
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

char* mi_strtok( char *frase,const char* delim);
char coincidencia(const char letra,const char* diccionario,const int tam);

int main( )
{
   char frase[101];

   printf("Intro frase: ");
   fflush( stdout );
   fgets(frase, 101, stdin);
   char* s;

   if ( ( s = mi_strtok( frase, ",") ) != NULL )
       printf( "%s\n", s );

   while ( ( s = mi_strtok( NULL, ",") ) != NULL )
       printf( "%s\n", s );

   return 0;
}

char* mi_strtok( char *frase,const char*delim )
{
   static char* frase_actual = NULL;
   char* principio;

   if (frase != NULL)
   {
       frase_actual = frase;
   }
   else if (frase_actual == NULL) return NULL;

   principio = frase_actual;

   const int tam = strlen(delim);
   char c;

   while ( ( c = *frase_actual ) != '\0' )
   {
       if (coincidencia(c,delim,tam))
       {
           *frase_actual = '\0';
           frase_actual++;
           return principio;
       }

       frase_actual++;
   }

   frase_actual = NULL;

   return principio;
}

char coincidencia(const char letra,const char* diccionario,const int tam)
{
   int i = 0;
   for (; i < tam;i++)
   {
       if (letra == diccionario[i]) return 1;
   }
   return 0;
}


La entrada: "1,2,3,4" me genera:
Citar1
2
3
4
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Yoel Alejandro

Casualmente hace unos días estaba pensando en cómo podría hacer un código que imitara la función estándar strtok() .... aunque al final no me senté a hacerlo.

Pero ya hoy obtuve la respuesta, y una solución hábil por cierto  ;D
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)