elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:43  


Tema destacado: Nueva página de elhacker.net en Google+ Google+

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Cadena estatica al devolver puntero de cadena.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cadena estatica al devolver puntero de cadena.  (Leído 238 veces)
alem29

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Cadena estatica al devolver puntero de cadena.
« en: 5 Febrero 2012, 22:31 »


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.
 


En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: Cadena estatica al devolver puntero de cadena.
« Respuesta #1 en: 5 Febrero 2012, 23:27 »

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


« Última modificación: 6 Febrero 2012, 00:01 por BlackZeroX (Astaroth) » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
eleon

Desconectado Desconectado

Mensajes: 56


Ver Perfil
Re: Cadena estatica al devolver puntero de cadena.
« Respuesta #2 en: 5 Febrero 2012, 23:38 »

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.
« Última modificación: 5 Febrero 2012, 23:41 por eleon » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cadena en ASP
Desarrollo Web
Azielito 5 1,550 Último mensaje 5 Enero 2004, 12:16
por Cobac
Crackear una cadena
Hacking Básico
Akagba 2 401 Último mensaje 31 Diciembre 2004, 10:06
por Akagba
Cadena mas cadena
Desarrollo Web
Rey11 2 295 Último mensaje 29 Octubre 2005, 18:20
por Rey11
cadena en c++
Programación C/C++
mpjm1989 2 684 Último mensaje 25 Noviembre 2009, 03:05
por Littlehorse
cadena en c++
Programación C/C++
mpjm1989 2 576 Último mensaje 27 Noviembre 2009, 22:29
por Littlehorse
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines