Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Arturo400 en 22 Septiembre 2016, 22:08 pm



Título: Consutla sobre un problema con punteros y memoria dinamica.
Publicado por: Arturo400 en 22 Septiembre 2016, 22:08 pm
Hola

Estoy realizando un programa en el cual tengo que leer una frase de un archivo y guardarla en un puntero. Hasta ahi no hay ningun problema. Luego lo que tengo que hacer es seleccionar un entero desde el cual se va a leer la frase y cuantos caracteres quiero leer de esa frase. Lo que queda va a ser guardado en un nuevo puntero que tengo que mostrar por pantalla.

Entonces si tengo la frase

"Universidad de Buenos Aires"

Y leo desde el caracter 4  unos 5 caracteres, en mi nuevo puntero tendria que quedar "ersida".

Hasta ahora he tratado de hacerlo y no le encuentro la forma, cuando intento que lea desde un cierto caracter o no copia nada al nuevo puntero o copia letras que no tendrian que ir.

Les dejo mi codigo para ver si me pueden ayudar para ver en que me estoy equivocando.
El programa se divide en una parte en donde le pido la informacion al archivo y la guardo en un nuevo puntero y la otra parte en donde intento a partir del puntero ya existente, crear otro.

Código
  1. [/#include <stdio.h>
  2. #include <stdlib.h>
  3. char * subcadena (char * p, unsigned int i, unsigned int n);  ///Esta funcion recibe mi puntero original y la longitud que quiero y retorna un nuevo puntero.
  4. char * LECTURA();
  5.  
  6. int main()
  7. {
  8.    char *pa; /// Puntero donde guardo la informacion del archivo
  9.    char *pb;
  10.    unsigned int inicio;
  11.    unsigned int cantidad;
  12.  
  13.    pa=LECTURA();
  14.    printf(" \nLo leido del archivo es : %s \n ",pa);
  15.    printf("Ingrese el caracter desde el cual desea leer de la frase : ");
  16.    scanf("%d",&inicio);
  17.    printf("\nIngrese la cantidad de caracteres que desea contar: ");
  18.    scanf("%d",&cantidad);
  19.    pb=subcadena(pa,inicio,cantidad);
  20.    printf("\nLa frase queda : %s",pb);
  21.    return 0;
  22. }
  23.  
  24.  
  25.  
  26. char* LECTURA()
  27. {
  28.    int i=0;
  29.    char c;
  30.    char *pa;
  31.  
  32.    FILE*arch;
  33.  
  34.    arch=fopen("C:\\Users\\PC\\Desktop\\frases.txt","r"); ///Supongamos que en el txt esta "Universidad De Buenos Aires" - Solo esa frase.
  35.  
  36.    pa=malloc(sizeof(char));
  37.  
  38.    c=fgetc(arch);
  39.  
  40.    while(!feof(arch))
  41.    {
  42.        *(pa+i)=c;
  43.        i++;
  44.        pa=realloc(pa,(i+1)*sizeof(char));
  45.        c=fgetc(arch);
  46.    }
  47.    *(pa+i)='\0';
  48.    fclose(arch);
  49.    return pa;
  50. }
  51.  
  52.  
  53.  
  54. char * subcadena (char * p, unsigned int i, unsigned int n)
  55. {
  56.  
  57. int j=0;
  58. char * pc;
  59. char letra;
  60. pc=malloc(sizeof(char));
  61. while(*(p+i)!='\0' && i<=n)
  62. {
  63.     letra=*(p+i);
  64.     *(pc+j)=letra;
  65.     j++;
  66.     pc=realloc(pc,(j+1)*sizeof(char));
  67.     i++;
  68. }
  69.    *(pc+j)='\0';
  70.    return pc;
  71. }
  72. code]


Título: Re: Consutla sobre un problema con punteros y memoria dinamica.
Publicado por: AlbertoBSD en 22 Septiembre 2016, 22:15 pm
Creo que asi deberia de quedar
Código
  1. char * subcadena (char * p, unsigned int i, unsigned int n) {
  2. int j=0;
  3. char *pc;
  4. pc=malloc(n-i+1);
  5. while(*(p+i+j)!='\0' && (i+j)<=n) {
  6. *(pc+j)=*(p+i+j);
  7. j++;
  8. }
  9. *(pc+i+j)='\0';
  10. return pc;
  11. }
Saludos!