Article View: es.comp.os.linux.programacion
Article #811Re: Ayuda con punteros [C]
From: Pascal Bourguignon
Date: Wed, 23 Aug 2006 09:04
Date: Wed, 23 Aug 2006 09:04
180 lines
5902 bytes
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-mailReferences:
<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=