🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #811

Re: Ayuda con punteros [C]

#811
From: Pascal Bourguignon
Date: Wed, 23 Aug 2006 09:04
180 lines
5902 bytes
AnimAlf <AnimAlf@engendro.sytes.net> writes:

> Hola,
>
> No me aclaro y no se por qu� pasan estas cosas, me podeis ayudar a
> terminar esta funci�n correctamente.
>
> Quiero que me quite los espacios en blanco del principio y del final de
> una cadena.
>
> Tal y como est� ahora, funciona y hace lo que yo quiero:
> DEBUG: Antes:   [       cadena       ]
> DEBUG: return:  [cadena]
> DEBUG: Despues: [cadena]
>
> pero si lo pruebo con las otras opciones (otra cadena) ... no se por
> donde cogerlo. Parece que siempre se tiene que reducir el sizeoff al
> retornar, pero no lo entiendo (no lo se):
> DEBUG: Antes:   [#______cadena______#]
> DEBUG: return:  [#______cadena______#]
> DEBUG: Despues: [#______c]
>
> �C�mo puedo solucionarlo?

Dividiendo para conquistar.  En lugar de hacer todo en una sola
funci�n, haga solo una parte m�s simple.  


#include <stdio.h>
#include <string.h>
#include <malloc.h>

/* 1- Quitemos los espacios a la izquierdad. �F�cil! */

    const char* string_trim_left(const char* string){
        while(' '==(*string)){string++;}
        return(string);}

/* 3- Aqu� la funci�n auxiliar para hacer una subcadena. */

    char* string_substring(const char* string,int start,int end){
        char* result=(char*)malloc(end-start+1);
        strncpy(result,string+start,end-start);
        result[end-start]='\0';
        return(result);}

/* 2- Quitemos los espacios a la derecha. �F�cil! 
      Pero vamos a usar una funci�n auxiliar para hacer una subcadena. */

    const char* string_trim_right(const char* string){
        const char* end=string+strlen(string);
        do{
            if(string==end){ return("");}
            end--;
        }while(' '==(*end));
        return(string_substring(string,0,end-string+1));}

/* 4- Luego, quitar los espacios de los dos lados es simpl�simo. */

    const char* string_trim(const char* string){
        return(string_trim_right(string_trim_left(string)));}

    int main(){
        const char* cadena[]={
            "",
            "x","    x","x     ","     x     ",
            "xyz","    xyz","xyz     ","     xyz     ",
            "x y z","    x y z","x y z     ","     x y z     ",
            "       cadena       ",
            "#______cadena______#",
            "       cad          ",
            "#      cadena       ",
            "       cadena      #",
            0};
        int i;
        for(i=0;cadena[i];i++){
            const char* result;
            printf ("\n\nDEBUG: Antes:\t[%s]\n",cadena[i]);
            result=string_trim(cadena[i]);
            printf ("DEBUG: Despues:\t[%s]\n",result);}
        return(0);}

/* Te queda como ejercicio: a�adir un parametro const char* junk a las
   funciones string_trim, string_trim_left y string_trim_right, y hacer
   que quiten cualquier caracterio en la cadena junk, no solo espacios. 
   As� podremos hacer:

       string_trim("#_","#______cadena______#") --> "cadena"     */


/* Y si el tema de la gesti�n de memoria ocure, vease:
   http://www.hpl.hp.com/personal/Hans_Boehm/gc/  */

------------------------------------------------------------------------

-*- mode: compilation; default-directory: "/tmp/" -*-
Compilation started at Wed Aug 23 10:56:29

gcc -Wall -o s s.c && ./s


DEBUG: Antes:	[]
DEBUG: Despues:	[]


DEBUG: Antes:	[x]
DEBUG: Despues:	[x]


DEBUG: Antes:	[    x]
DEBUG: Despues:	[x]


DEBUG: Antes:	[x     ]
DEBUG: Despues:	[x]


DEBUG: Antes:	[     x     ]
DEBUG: Despues:	[x]


DEBUG: Antes:	[xyz]
DEBUG: Despues:	[xyz]


DEBUG: Antes:	[    xyz]
DEBUG: Despues:	[xyz]


DEBUG: Antes:	[xyz     ]
DEBUG: Despues:	[xyz]


DEBUG: Antes:	[     xyz     ]
DEBUG: Despues:	[xyz]


DEBUG: Antes:	[x y z]
DEBUG: Despues:	[x y z]


DEBUG: Antes:	[    x y z]
DEBUG: Despues:	[x y z]


DEBUG: Antes:	[x y z     ]
DEBUG: Despues:	[x y z]


DEBUG: Antes:	[     x y z     ]
DEBUG: Despues:	[x y z]


DEBUG: Antes:	[       cadena       ]
DEBUG: Despues:	[cadena]


DEBUG: Antes:	[#______cadena______#]
DEBUG: Despues:	[#______cadena______#]


DEBUG: Antes:	[       cad          ]
DEBUG: Despues:	[cad]


DEBUG: Antes:	[#      cadena       ]
DEBUG: Despues:	[#      cadena]


DEBUG: Antes:	[       cadena      #]
DEBUG: Despues:	[cadena      #]

Compilation finished at Wed Aug 23 10:56:29


-- 
__Pascal Bourguignon__                     http://www.informatimago.com/
Cats meow out of angst
"Thumbs! If only we had thumbs!
We could break so much!"
Technical Details
Message-ID: <87sljnakm0.fsf@thalassa.informatimago.com>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!news2.volia.net!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
References: <1156305914.21671.6.camel@general.engendro.sytes.net>

Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,b5fe46047b709e60
X-Google-Attributes: gidf86c8,public
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news2.google.com!news4.google.com!news2.volia.net!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From: Pascal Bourguignon <pjb@informatimago.com>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Ayuda con punteros [C]
Date: Wed, 23 Aug 2006 11:04:39 +0200
Organization: Informatimago
Lines: 180
Message-ID: <87sljnakm0.fsf@thalassa.informatimago.com>
References: <1156305914.21671.6.camel@general.engendro.sytes.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: individual.net SOLVZ/JvL60PCc2LluBL0Q9vOK4IHU1V4K/TBtxdi8szFgIppk
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAABlBMVEUAAAD///+l2Z/dAAAA
      oElEQVR4nK3OsRHCMAwF0O8YQufUNIQRGIAja9CxSA55AxZgFO4coMgYrEDDQZWPIlNAjwq9
      033pbOBPtbXuB6PKNBn5gZkhGa86Z4x2wE67O+06WxGD/HCOGR0deY3f9Ijwwt7rNGNf6Oac
      l/GuZTF1wFGKiYYHKSFAkjIo1b6sCYS1sVmFhhhahKQssRjRT90ITWUk6vvK3RsPGs+M1RuR
      mV+hO/VvFAAAAABJRU5ErkJggg==
X-Accept-Language:         fr, es, en
X-Disabled: X-No-Archive: no
User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)
Cancel-Lock: sha1:Ngfpwv+CWCVTTkLCSBiZBqibncY=