Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: alem29 en 5 Febrero 2012, 22:31 pm



Título: Cadena estatica al devolver puntero de cadena.
Publicado por: alem29 en 5 Febrero 2012, 22:31 pm

Buenas, estoy iniciandome en la programacion c++ y hay ciertas cosas que no entiendo. Ojala pueda ayudarme.
Hay una parte de un codigo que no entiendo.El programa es simple. Consiste en que dada una cadena se ingrese un caracter y el programa debe crear una subcadena que contenga todos los elementos que habia antes de ese caracter.

Ejemplo: 
Cual es la cadena?: "El cielo esta nublado"
Ingrese el caracter  a buscar: "a"
La subcadena es:  "El cielo est"

El profesor del curso, hizo el siguiente codigo:

Código:
#include<iostream>
#include<stdio.h>
using namespace std;
const int N=250;
void LeerCadena(char cad[N])
{
    cout<<"Cual es la cadena:"; fflush(stdin);
    gets(cad);
}
char* GeneraSubcadena(char *c, char car)
{  static char x[N];
    char *q;
      q=x;  //q=&x[0];
      while(*c!='\0')
      {
          if(*c!=car)
          { *q=*c;
              q++;
          }
          else
          { *q='\0';
              break;
          }
          c++;
      }
      return x;
}
int main()
{  char cadena[N],a, *cade;
    cout<<"Ingrese caracter a buscar:", cin>>a;
    LeerCadena(cadena);
    cade=GeneraSubcadena(cadena,a);
    cout<<"La subcadena es = "<<cade<<endl;
 system ("pause");
 return (0);   
}

Siendo principiante me ha tomado tiempo entender cada parte de ese codigo, pero no llego a entender por qué dentro de la funcion Generasubcadena se declaro la cadena x[ ] como "static". Cuando borro "static" del codigo  el programa no muestra ninguna cadena, asi que parece ser algo importante.

Y una pregunta mas: Asi como en el codigo anterior, a veces se crean cadenas dentro de una funcion, luego si queremos retornar esa cadena al main, lo que se retorna es un puntero que apunte hacia dicha cadena. Lo que no entiendo es: Cuando se retorna el puntero, la funcion se cierra y dado que la cadena solo es conocida localmente dentro de la funcion ¿no deberia borrarse todo el contenido del arreglo?  por tanto ¿el puntero ya no tendria que apuntar?

Gracias por vuestra ayuda.
 


Título: Re: Cadena estatica al devolver puntero de cadena.
Publicado por: BlackZeroX en 5 Febrero 2012, 23:27 pm
JAJAJA no se por que no te lei... solo vi tu código..., la respuesta esta en que se retorna una variable estática que se destruye al finalizar tu aplicación, mas no al finalizar la función,

---->

mira este código es C...

Código:

#include <stdlib.h>
#include <stdio.h>   //<stdio.h>
#include <string.h>  //<stdio.h>

const int BUFFER = 250;

char* SubExtractFrontBegin(const char* szIn, const char caracter);
char* ReadInput(FILE* FileSrc);

int main()
{
    char*   szCadena    = NULL;
    char*   szSubCadena = NULL;
    char    Caracter    = 0;

    puts("Ingresa la cadena:\n");
    szCadena = ReadInput(stdin);

    puts("Ingrese caracter a buscar:\n");
    Caracter = getchar();

    szSubCadena = SubExtractFrontBegin(szCadena, Caracter);


    printf("Subcadena:%s\n", szSubCadena);
    free(szCadena);
    free(szSubCadena);

    getchar();

    return EXIT_SUCCESS;
}

char* SubExtractFrontBegin(const char* szIn, const char caracter)
{
    char szDelim[2] = {caracter, '\0'};
    char* szPos = strstr(szIn, szDelim);
    char* szRet = NULL;

    if (szPos == NULL) return szRet;

    szRet = (char*)malloc(((size_t)szPos) - ((size_t)szIn) + 1);
    memcpy(szRet, szIn, (size_t)szPos - (size_t)szIn);

    return szRet;
}

char* ReadInput(FILE* FileSrc)
{
    char c = 0;
    char *szRet = NULL;
    size_t size = 0;

    while(++size)
    {
        szRet = (char*)realloc(szRet, size);
        fread(&c, 1, 1, FileSrc);
        if (c == '\n')
            break;  //  exit while(1)
        szRet[size - 1] = c;
    }
    return szRet;
}

Dulces Lunas!¡.


Título: Re: Cadena estatica al devolver puntero de cadena.
Publicado por: eleon en 5 Febrero 2012, 23:38 pm
Citar
Siendo principiante me ha tomado tiempo entender cada parte de ese codigo, pero no llego a entender por qué dentro de la funcion Generasubcadena se declaro la cadena x[ ] como "static". Cuando borro "static" del codigo  el programa no muestra ninguna cadena, asi que parece ser algo importante.

Lo que hace "static" es que, al finalizar la función, no se eliminan las variables declaradas dentro de ella, esto es, si almacenas algo en la tabla declarada como "static", al terminar la función podrás volver a llamarla y seguirás pudiendo trabajar con los datos almacenados en la tabla o incluso si devuelves un puntero puedes usarla en el cuerpo del programa (que es exactamente lo que hace tu código).

Citar
Y una pregunta mas: Asi como en el codigo anterior, a veces se crean cadenas dentro de una funcion, luego si queremos retornar esa cadena al main, lo que se retorna es un puntero que apunte hacia dicha cadena. Lo que no entiendo es: Cuando se retorna el puntero, la funcion se cierra y dado que la cadena solo es conocida localmente dentro de la funcion ¿no deberia borrarse todo el contenido del arreglo?  por tanto ¿el puntero ya no tendria que apuntar?

Totalmente correcto, excepto porque se declara como "static", al finalizar la función no se elimina.

Saludos.