Cómo extraer caracteres en C

Iniciado por sora_ori, 13 Diciembre 2013, 13:07 PM

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

sora_ori

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

                      printf("Cuantos caracteres quieres extraer? ");
                      scanf("%d", &extraerIzq);
                     
                      for (i=0; i<longitud && i<extraerIzq; i++){
                          printf("\nSe ha extraido: %c", cadena[i]);
                      }


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

leosansan

#1
Cita de: sora_ori en 13 Diciembre 2013, 13:07 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 (cpp) [Seleccionar]

#include <stdio.h>

int  main(void)
{
    int ch,extraer,longitud,i,flag;
    char cadena[]="leosansan";
    for (i=0;cadena[i] ;i++);
    longitud=i;
    do {
        printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
        fflush(stdout);
        flag=(scanf("%d", &extraer));
        while( (ch = getchar()) != '\n' );
    }while (extraer > longitud ||flag==0);
    char cadenaIzq[extraer+1];
    for (i=0; i<extraer; i++){
        printf("Se ha extraido : %c\n", cadena[i]);
        cadenaIzq[i]=cadena[i];
    }
    cadenaIzq[i]='\0';
    printf("\nSe ha extraido : %s\n", cadenaIzq);
    return 0;
}


Saluditos! ..... !!!!        

rir3760

Cita de: sora_ori en 13 Diciembre 2013, 13:07 PM
Estoy haciendo un programa en C y una opción es extraer caracteres comenzando desde la izquierda [...]

EXTRAER DESDE LA IZQUIERDA

printf("Cuantos caracteres quieres extraer? ");
scanf("%d", &extraerIzq);

for (i=0; i<longitud && i<extraerIzq; i++){
   printf("\nSe ha extraido: %c", cadena[i]);
}
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:
printf("Cuantos caracteres quieres extraer? ");
fflush(stdout);
if (scanf("%d", &extraerIzq) == 1 && extraerIzq > 0)
   printf("%.*s\n", extraerIzq, cadena);


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

sora_ori

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!

leosansan

#4
Cita de: sora_ori en 14 Diciembre 2013, 08:55 AM
..................................................................

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 (cpp) [Seleccionar]
#include <stdio.h>

int  main(void)
{
   int ch,extraer,longitud,i,j,flag;
   char cadena[]="leosansan";
   for (i=0;cadena[i] ;i++);
   longitud=i;
   do {
       printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
       fflush(stdout);
       flag=(scanf("%d", &extraer));
       while( (ch = getchar()) != '\n' );
   }while (extraer > longitud ||flag==0);
   char cadenaIzq[longitud-extraer+1];
   for (i=extraer,j=0; i<longitud; i++,j++)
       cadenaIzq[j]=cadena[i];
   cadenaIzq[longitud-extraer]='\0';
   printf("\nCadena original  %s\n",cadena);
   printf("\nSe ha extraido  %.*s\n", extraer, cadena);
   printf("\nY queda la cadena : %s\n", cadenaIzq);
   return 0;
}


Saluditos! ..... !!!!        

REEDITADO.

sora_ori

#5
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

leosansan

#6
¿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 (cpp) [Seleccionar]


#include <stdio.h>

int  main(void)
{
    int ch,extraer,longitud,i,j,flag;
    char cadena[]="leosansan";
    for (i=0;cadena[i] ;i++);
    longitud=i;
    do {
        printf("Cuantos caracteres quieres extraer?.Inferior a %d :",longitud);
        fflush(stdout);
        flag=(scanf("%d", &extraer));
        while( (ch = getchar()) != '\n' );
    }while (extraer > longitud ||flag==0);
    char cadenaDcha[longitud-extraer+1];
    for (i=0,j=0; i<longitud-extraer; i++,j++)
        cadenaDcha[j]=cadena[i];
    cadenaDcha[j]='\0';
    printf("\nCadena original  %s\n",cadena);
    printf("\nSe ha extraido:");
    for (i=longitud-extraer; i<longitud; i++)
        printf("%c", cadena[i]);
    printf("\n\nY queda la cadena : %s\n", cadenaDcha);
    return 0;
}
}


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! ..... !!!!        

ivancea96

Haced la clase String para C jaja. Al menos haced una réplica de las funciones y operadores básicos xDD

leosansan


¿Te puedes explicar mejor ivancea96?.

Saluditos! ..... !!!!       

ivancea96

Naada era de coña. Pero más explicado no puede estar xD