elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  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 3,516 veces)
alem29

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Cadena estatica al devolver puntero de cadena.
« 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.
 


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Cadena estatica al devolver puntero de cadena.
« Respuesta #1 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!¡.


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

The Dark Shadow is my passion.
eleon

Desconectado Desconectado

Mensajes: 99


Ver Perfil
Re: Cadena estatica al devolver puntero de cadena.
« Respuesta #2 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.
« Última modificación: 5 Febrero 2012, 23:41 pm por eleon » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Devolver puntero a cadena en función
ASM
silver2050 2 3,027 Último mensaje 22 Mayo 2013, 00:31 am
por silver2050
[?] C++ Ayuda Recorrer cadena?
Programación C/C++
Scene 2 10,902 Último mensaje 9 Septiembre 2013, 17:42 pm
por rir3760
Codigo que estraiga de una cadena las palabras que empiecen por otra cadena
Java
Javator 4 3,679 Último mensaje 25 Febrero 2014, 17:09 pm
por Javator
Como devolver puntero con cadena vacia
Programación C/C++
Destro- 6 3,843 Último mensaje 17 Marzo 2014, 22:30 pm
por Eternal Idol
Devolver cadena con función
Programación C/C++
Kaxperday 7 3,468 Último mensaje 6 Agosto 2014, 05:55 am
por leosansan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines