Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sora_ori en 13 Diciembre 2013, 13:07 pm



Título: Cómo extraer caracteres en C
Publicado por: sora_ori en 13 Diciembre 2013, 13:07 pm
Hola,

Estoy haciendo un programa en C y una opción es extraer caracteres comenzando desde la izquierda y otra opción es extraer caracteres comenzando desde la derecha.

He podido printar solo los caracteres que se han extraido pero no consigo printar el resultado de la cadena.

EXTRAER DESDE LA IZQUIERDA
Código
  1.                      printf("Cuantos caracteres quieres extraer? ");
  2.                      scanf("%d", &extraerIzq);
  3.  
  4.                      for (i=0; i<longitud && i<extraerIzq; i++){
  5.                          printf("\nSe ha extraido: %c", cadena[i]);
  6.                      }

EXTRAER DESDE LA DERECHA
Código
  1. printf("Cuantos caracteres quieres extraer? ");
  2.                      scanf("%d", &extraerDer);
  3.  
  4.                      extraerDer = longitud - (extraerDer > longitud?longitud:extraerDer);
  5.                      for (i = longitud - 1; i >= extraerDer; i--)
  6.                          printf("\nSe ha extraido: %c", cadena[i]);


Título: Re: Cómo extraer caracteres en C
Publicado por: leosansan en 13 Diciembre 2013, 14:46 pm
Hola,

...........................................
He podido printar solo los caracteres que se han extraido pero no consigo printar el resultado de la cadena.


Das a entender que además de imprimir los caracteres que extraes los quieres guardar en una nueva cadena, cosa que te faltaría.

Por otro lado sería interesante un bucle que asegure que el número de caracteres a extraer sea inferior a la longitud de la cadena original.

Te dejo una muestra por la izquierda. Análogamente sería para la derecha. Aunque yo personalmente soy partidario en este caso de crear una función que recoja ambos casos.

A ver si te sirve de idea:


Citar
Cuantos caracteres quieres extraer?.Inferior a 9 :12
Cuantos caracteres quieres extraer?.Inferior a 9 :6

Se ha extraido : l
Se ha extraido : e
Se ha extraido : o
Se ha extraido : s
Se ha extraido : a
Se ha extraido : n
Se ha extraido : leosan


Código
  1. #include <stdio.h>
  2.  
  3. int  main(void)
  4. {
  5.    int ch,extraer,longitud,i,flag;
  6.    char cadena[]="leosansan";
  7.    for (i=0;cadena[i] ;i++);
  8.    longitud=i;
  9.    do {
  10.        printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
  11.        fflush(stdout);
  12.        flag=(scanf("%d", &extraer));
  13.        while( (ch = getchar()) != '\n' );
  14.    }while (extraer > longitud ||flag==0);
  15.    char cadenaIzq[extraer+1];
  16.    for (i=0; i<extraer; i++){
  17.        printf("Se ha extraido : %c\n", cadena[i]);
  18.        cadenaIzq[i]=cadena[i];
  19.    }
  20.    cadenaIzq[i]='\0';
  21.    printf("\nSe ha extraido : %s\n", cadenaIzq);
  22.    return 0;
  23. }
  24.  

Saluditos! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Cómo extraer caracteres en C
Publicado por: rir3760 en 13 Diciembre 2013, 16:40 pm
Estoy haciendo un programa en C y una opción es extraer caracteres comenzando desde la izquierda [...]

EXTRAER DESDE LA IZQUIERDA
Código
  1. printf("Cuantos caracteres quieres extraer? ");
  2. scanf("%d", &extraerIzq);
  3.  
  4. for (i=0; i<longitud && i<extraerIzq; i++){
  5.   printf("\nSe ha extraido: %c", cadena[i]);
  6. }
Para imprimir los primeros caracteres de una cadena no es necesario un bucle, puedes utilizar printf con el especificador "%.*s" donde ".*" indica que el siguiente argumento de la función sera el máximo de caracteres a imprimir. Siguiendo tu ejemplo:
Código
  1. printf("Cuantos caracteres quieres extraer? ");
  2. fflush(stdout);
  3. if (scanf("%d", &extraerIzq) == 1 && extraerIzq > 0)
  4.   printf("%.*s\n", extraerIzq, cadena);

Un saludo


Título: Re: Cómo extraer caracteres en C
Publicado por: sora_ori en 14 Diciembre 2013, 08:55 am
Gracias por la ayuda, pero "leosansan" el ejemplo que me has puesto era todo lo contrario a lo que quería jeje

A lo que me refería es que me mostrará el resultado de como quedaría una vez con los caracteres extraídos, de todos modos me vendrá bien guardar tu ejemplo porque también me servirá.


Gracias!


Título: Re: Cómo extraer caracteres en C
Publicado por: leosansan en 14 Diciembre 2013, 13:01 pm
..................................................................

A lo que me refería es que me mostrará el resultado de como quedaría una vez con los caracteres extraídos, de todos modos me vendrá bien guardar tu ejemplo porque también me servirá.


Sorry, entendí mal.

Aprovecho la aportación de rir3760 y corrijo la cadena final. Creo que sería algo como esto:


Citar
Cuantos caracteres quieres extraer?.Inferior a 9 :6

Cadena original  leosansan

Se ha extraido  leosan

Y queda la cadena : san

Código
  1. #include <stdio.h>
  2.  
  3. int  main(void)
  4. {
  5.    int ch,extraer,longitud,i,j,flag;
  6.    char cadena[]="leosansan";
  7.    for (i=0;cadena[i] ;i++);
  8.    longitud=i;
  9.    do {
  10.        printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
  11.        fflush(stdout);
  12.        flag=(scanf("%d", &extraer));
  13.        while( (ch = getchar()) != '\n' );
  14.    }while (extraer > longitud ||flag==0);
  15.    char cadenaIzq[longitud-extraer+1];
  16.    for (i=extraer,j=0; i<longitud; i++,j++)
  17.        cadenaIzq[j]=cadena[i];
  18.    cadenaIzq[longitud-extraer]='\0';
  19.    printf("\nCadena original  %s\n",cadena);
  20.    printf("\nSe ha extraido  %.*s\n", extraer, cadena);
  21.    printf("\nY queda la cadena : %s\n", cadenaIzq);
  22.    return 0;
  23. }
  24.  

Saluditos! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

REEDITADO.


Título: Re: Cómo extraer caracteres en C
Publicado por: sora_ori en 15 Diciembre 2013, 09:31 am
Perfecto, muchas gracias!!!  ;-)

¿Comenzando a extraer desde la derecha como sería?


Perdona las molestias pero es que aún soy novatito en C  :P


Título: Re: Cómo extraer caracteres en C
Publicado por: leosansan en 15 Diciembre 2013, 13:24 pm
¿Algo como esto?:

Citar
Cuantos caracteres quieres extraer?.Inferior a 9 :6

Cadena original  leosansan

Se ha extraido:sansan

Y queda la cadena : leo


Código
  1.  
  2. #include <stdio.h>
  3.  
  4. int  main(void)
  5. {
  6.    int ch,extraer,longitud,i,j,flag;
  7.    char cadena[]="leosansan";
  8.    for (i=0;cadena[i] ;i++);
  9.    longitud=i;
  10.    do {
  11.        printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
  12.        fflush(stdout);
  13.        flag=(scanf("%d", &extraer));
  14.        while( (ch = getchar()) != '\n' );
  15.    }while (extraer > longitud ||flag==0);
  16.    char cadenaDcha[longitud-extraer+1];
  17.    for (i=0,j=0; i<longitud-extraer; i++,j++)
  18.        cadenaDcha[j]=cadena[i];
  19.    cadenaDcha[j]='\0';
  20.    printf("\nCadena original  %s\n",cadena);
  21.    printf("\nSe ha extraido:");
  22.    for (i=longitud-extraer; i<longitud; i++)
  23.        printf("%c", cadena[i]);
  24.    printf("\n\nY queda la cadena : %s\n", cadenaDcha);
  25.    return 0;
  26. }
  27. }
  28.  

Se puede mejorar creando un array cadenaIzda que guarde el resto de la cadena, ya que como está sólo la imprimo. ¿Te animas?.

Como ves puedes incluir en un sólo código ambos casos. No lo he hecho por pereza xD!.


Saluditos! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Cómo extraer caracteres en C
Publicado por: ivancea96 en 15 Diciembre 2013, 14:07 pm
Haced la clase String para C jaja. Al menos haced una réplica de las funciones y operadores básicos xDD


Título: Re: Cómo extraer caracteres en C
Publicado por: leosansan en 15 Diciembre 2013, 14:33 pm

¿Te puedes explicar mejor ivancea96?.

Saluditos! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Cómo extraer caracteres en C
Publicado por: ivancea96 en 15 Diciembre 2013, 15:02 pm
Naada era de coña. Pero más explicado no puede estar xD


Título: Re: Cómo extraer caracteres en C
Publicado por: leosansan en 15 Diciembre 2013, 15:22 pm
Naada era de coña. Pero más explicado no puede estar xD

Sorry, "toy" sencible, pero ahora lo pillo, tipo C++. ;-)

Aprovecho para postear el código con las dos operaciones a la vez:

Código
  1. #include <stdio.h>
  2.  
  3. int  main(void)
  4. {
  5.    int ch,extraer,longitud,i,j,flag;
  6.    char cadena[]="leosansan";
  7.    for (i=0;cadena[i] ;i++);
  8.    longitud=i;
  9.    do {
  10.        printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
  11.        fflush(stdout);
  12.        flag=(scanf("%d", &extraer));
  13.        while( (ch = getchar()) != '\n' );
  14.    }while (extraer > longitud ||flag==0);
  15.    char cadenaDcha[longitud-extraer+1];
  16.    for (i=0,j=0; i<longitud-extraer; i++,j++)
  17.        cadenaDcha[j]=cadena[i];
  18.    cadenaDcha[j]='\0';
  19.    printf("\nCadena original:  %s\n",cadena);
  20.    printf("\nSe ha extraido por la derecha: ");
  21.    fflush(stdout);
  22.    for (i=longitud-extraer; i<longitud; i++)
  23.        printf("%c", cadena[i]);
  24.        printf("\n\nY queda la cadena: %s\n", cadenaDcha);
  25.  
  26.    char cadenaIzq[longitud-extraer+1];
  27.    for (i=extraer,j=0; i<longitud; i++,j++)
  28.        cadenaIzq[j]=cadena[i];
  29.    cadenaIzq[j]='\0';
  30.    printf("\nSe ha extraido por la izquierda: %.*s\n", extraer, cadena);
  31.    printf("\nY queda la cadena: %s\n", cadenaIzq);
  32.    return 0;
  33. }
  34.  

Pero mejor es el que sigue, ya que guarda en arrays los restos de las cadenas:

Código
  1.  
  2. #include <stdio.h>
  3.  
  4. int  main(void)
  5. {
  6.    int ch,extraer,longitud,i,j,flag;
  7.    char cadena[]="leosansan";
  8.    for (i=0;cadena[i] ;i++);
  9.    longitud=i;
  10.    do {
  11.        printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
  12.        fflush(stdout);
  13.        flag=(scanf("%d", &extraer));
  14.        while( (ch = getchar()) != '\n' );
  15.    }while (extraer > longitud ||flag==0);
  16.  
  17.    char cadenaDcha[longitud-extraer+1],cadenaIzq[longitud-extraer+1],cadenaDcha_resto[extraer],cadenaIzqda_resto[extraer];
  18.    printf("\nCadena original:  %s\n",cadena);
  19.  
  20.    for (i=0,j=0; i<longitud-extraer; i++,j++)
  21.        cadenaDcha[j]=cadena[i];
  22.    cadenaDcha[j]='\0';
  23.    for (i=longitud-extraer,j=0; i<longitud; i++,j++)
  24.        cadenaDcha_resto[j]=cadena[i];
  25.    cadenaDcha_resto[j]='\0';
  26.    printf("\nSe ha extraido por la derecha: %s\n",cadenaDcha_resto);
  27.    printf("\nY queda la cadena: %s\n", cadenaDcha);
  28.  
  29.    for (i=extraer,j=0; i<longitud; i++,j++)
  30.        cadenaIzq[j]=cadena[i];
  31.    cadenaIzq[j]='\0';
  32.    for (i=0,j=0; i<extraer; i++,j++)
  33.        cadenaIzqda_resto[j]=cadena[i];
  34.    cadenaIzqda_resto[j]='\0';
  35.    printf("\nSe ha extraido por la izquierda: %s\n", cadenaIzqda_resto);
  36.    printf("\nY queda la cadena: %s\n", cadenaIzq);
  37.    return 0;
  38. }
  39.  

Ya sólo queda hacerlo mediante una función que sirva tanto para la izquierda como para la derecha aprovechando que esas partes del código son cuasi-iguales.

Saluditos! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Cómo extraer caracteres en C
Publicado por: leosansan en 16 Diciembre 2013, 13:54 pm
Perdonen que postee nuevamente, pero el aporte quedo pendiente y por ser tan diferente lo hago así.

Esta vez construyo una función a la que invoco para extraer tanto por la derecha como por la izquierda:


Código
  1. #include <stdio.h>
  2.  
  3. void extraer_y_resto (char *Cadena_lado, char *Cadena,char *Cadena_resto,int a, int b,int c, int d);
  4. void imprimir(char *msg,char *Cadena_resto,char *Cadena_lado);
  5.  
  6. int  main(void)
  7. {
  8.    int ch,extraer,longitud,i,j,flag;
  9.    char cadena[]="leosansan";
  10.    for (i=0;cadena[i] ;i++);
  11.    longitud=i;
  12.    do {
  13.        printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
  14.        fflush(stdout);
  15.        flag=(scanf("%d", &extraer));
  16.        while( (ch = getchar()) != '\n' );
  17.    }while (extraer > longitud ||flag==0);
  18.    char cadena_Lado[longitud-extraer+1],cadena_resto[extraer];
  19.    printf("\nCadena original:  %s\n",cadena);
  20.    extraer_y_resto (cadena_Lado, cadena,cadena_resto,0,longitud-extraer ,longitud-extraer, longitud);
  21.    imprimir ("derecha",cadena_resto,cadena_Lado);
  22.    extraer_y_resto (cadena_Lado,cadena, cadena_resto, extraer, longitud, 0,extraer);
  23.    imprimir ("izquierda",cadena_resto,cadena_Lado);
  24.    return 0;
  25. }
  26.  
  27. void extraer_y_resto (char *Cadena_lado, char *Cadena,char *Cadena_resto,int a, int b,int c, int d)
  28. {
  29.    int i,j;
  30.    for (i=a,j=0; i<b; i++,j++)
  31.        Cadena_lado[j]=Cadena[i];
  32.    Cadena_lado[j]='\0';
  33.    for (i=c,j=0; i<d; i++,j++)
  34.        Cadena_resto[j]=Cadena[i];
  35.    Cadena_resto[j]='\0';
  36. }
  37. void imprimir(char *msg,char *Cadena_resto,char *Cadena_lado)
  38. {
  39.    printf("\nSe ha extraido por la %s: %s\n",msg,Cadena_resto);
  40.    printf("\nY queda la cadena: %s\n", Cadena_lado);
  41. }
  42.  

Saluditos! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)