Thread View: es.comp.os.linux.programacion
7 messages
7 total messages
Started by AnimAlf
Wed, 23 Aug 2006 04:05
Ayuda con punteros [C]
Author: AnimAlf
Date: Wed, 23 Aug 2006 04:05
Date: Wed, 23 Aug 2006 04:05
78 lines
3210 bytes
3210 bytes
--=-8zDIVEh8PFI9Z+MNin/g
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Hola,
No me aclaro y no se por qu=C3=A9 pasan estas cosas, me podeis ayudar a
terminar esta funci=C3=B3n correctamente.
Quiero que me quite los espacios en blanco del principio y del final de
una cadena.
Tal y como est=C3=A1 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]
=C2=BFC=C3=B3mo puedo solucionarlo?
#include <stdio.h>
#include <string.h>
void strtrim (char **flujo){
int caracteres, espacios;
char tmpStr[255];
strcpy (tmpStr, *flujo);
while (tmpStr [0] =3D=3D ' '){
strcpy (tmpStr, &tmpStr [1]);
}
do {
caracteres =3D strlen (tmpStr);
if (tmpStr[caracteres-1]=3D=3D' ') {
espacios=3D1;
tmpStr [caracteres-1] =3D '\0';
} else { espacios =3D 0;}
} while (espacios);
*flujo =3D tmpStr;
printf ("DEBUG: return:\t[%s]\n",*flujo);
}
int main () {
char * cadena =3D " cadena ";
/* char * cadena =3D "#______cadena______#"; */
/* char * cadena =3D " cad "; */=20
/* char * cadena =3D "# cadena "; */
/* char * cadena =3D " cadena #"; */
printf ("DEBUG: Antes:\t[%s]\n",cadena);
strtrim(&cadena);
printf ("DEBUG: Despues:\t[%s]\n",cadena);
}
-------
Gracias
--=-8zDIVEh8PFI9Z+MNin/g
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: =?ISO-8859-1?Q?Aix=F2?= =?ISO-8859-1?Q?_=E9s?= una part
d'un missatge, signada digitalment
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)
iQCVAwUAROvT+h535IyztBIVAQK33wP8DsMadbl8Y9w4XQ1RI+hrpM1dD7QZzBpV
F3XW3u2dDJxLtLXnzE5XzlTNq3cF5V/nJJqzwcJxmdIGGEZVCoQXD61EeTfXa6/j
GCwbsTwaSqvUBVnJmMdfYwfef/l2ww+arPPKuv69Ey7a6B2pD8yWduRYOtnSFWOB
/8LO0jNsnEU=
=Zyq7
-----END PGP SIGNATURE-----
--=-8zDIVEh8PFI9Z+MNin/g--
Re: Ayuda con punteros [C]
Author: 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!"
Re: Ayuda con punteros [C]
Author: Claudio
Date: Wed, 23 Aug 2006 11:53
Date: Wed, 23 Aug 2006 11:53
30 lines
1745 bytes
1745 bytes
Un comentario marginal:
On 2006-08-23, AnimAlf <AnimAlf@engendro.sytes.net> wrote:
>
> #include <stdio.h>
> #include <string.h>
>
> void strtrim (char **flujo){
> int caracteres, espacios;
> char tmpStr[255];
> strcpy (tmpStr, *flujo);
> while (tmpStr [0] =3D=3D ' '){
> strcpy (tmpStr, &tmpStr [1]);
Esto mejor se pone como strcpy (tmpStr, tmpStr+1)
Y la funci�n strcpy exige que las cadenas no tengan
partes comunes, no deber�as usarla en ese caso.
Adem�s tal y como lo pones es ineficiente porque
haces varios strcpy, cuando en realidad basta uno.
Como lo que te pasan es un char **flujo, lo f�cil debe ser
cambiar *flujo: while (*flujo && *flujo==' ') *flujo++;
algo as�.
Un saludo.
--claudio--
Re: Ayuda con punteros [C]
Author: iarenaza
Date: Wed, 23 Aug 2006 12:00
Date: Wed, 23 Aug 2006 12:00
33 lines
2447 bytes
2447 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
>>>>> "Pascal" == Pascal Bourguignon <pjb@informatimago.com> writes:
Pascal> /* 3- Aqu� la funci�n auxiliar para hacer una subcadena. */
Pascal> char* string_substring(const char* string,int start,int end){
Pascal> char* result=(char*)malloc(end-start+1);
Pascal> strncpy(result,string+start,end-start);
Pascal> result[end-start]='\0';
Pascal> return(result);}
Ya que estamos, comprobar que malloc nos ha devuelto un puntero v�lido
ser�a una buena idea (no vaya a ser que nos hayamos quedado sin
memoria y nos devuelva NULL).
Lo cual har� que tengamos que retornar alg�n tipo de c�digo de error
en alg�n sitio en dicho caso.
Saludos. I�aki.
- --
Get PGP/GPG Keys at http://www.escomposlinux.org/iarenaza/pgpkey.php
I use free software / Yo uso software libre
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.8 <http://mailcrypt.sourceforge.net/>
iD8DBQFE7ENJZXLnGT1HLgcRAuijAJ4iAWNHTdwzWaeepbc9Ikz/jPhhDQCfZ4hU
VxXLrrELme0klrz5fy+EDKA=
=uZe/
-----END PGP SIGNATURE-----
Re: Ayuda con punteros [C]
Author: AnimAlf
Date: Wed, 30 Aug 2006 14:50
Date: Wed, 30 Aug 2006 14:50
116 lines
4755 bytes
4755 bytes
Ahhh! Estoy leyendo en google i veo que no se publicó ninguna
respuesta mia :(( no estiendo.
La reenvio. Y gracias a todos por la ayuda :))
El dc 23 de 08 del 2006 a les 11:53 +0000, en/na Claudio va escriure:
> Esto mejor se pone como strcpy (tmpStr, tmpStr+1)
> Y la función strcpy exige que las cadenas no tengan
> partes comunes, no deberías usarla en ese caso.
Soy muy desconocedor de tema, siempre optenia un desagrable violación
de
segmento
> Además tal y como lo pones es ineficiente porque
> haces varios strcpy, cuando en realidad basta uno.
>
> Como lo que te pasan es un char **flujo, lo fácil debe ser
> cambiar *flujo: while (*flujo && *flujo==' ') *flujo++;
> algo así.
grácias, tras hoy, todo esto me empieza a parecer menos abstracto (lo
de
los desplazamientos por memoria)
El dc 23 de 08 del 2006 a les 11:04 +0200, en/na Pascal Bourguignon va
escriure:
> AnimAlf <AnimAlf@engendro.sytes.net> writes:
>
> > Hola,
> >
> > ¿Cómo puedo solucionarlo?
>
> Dividiendo para conquistar. En lugar de hacer todo en una sola
> función, haga solo una parte más simple.
Muchisimas grácias. Me va a servir mucho más que toda la teoria que
por
muchas veces que me repita a mi mismo, no logro comprender.
> /* 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:
Vale :))
Como siempre primero me vuelvo loco intentando hacer como lo haría en
Pascal ... y despues de perder los nervios i no encontrar algo similar
al 'in' de pascal, pués función nueva.
me hubiese gustado poder haber echo algo como if (c in [str])
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdbool.h>
bool en (char *grupo, char c){
int i;
for (i=0; i<strlen(grupo); i++) {if (grupo[i]==c){return true;}};
return false;
}
const char* string_trim_left(const char* string, char* junk){
while(en(junk,(*string))){string++;}
return(string);
}
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);
}
const char* string_trim_right(const char* string, char* junk){
const char* end=string+strlen(string);
do{
if(string==end){ return("");}
end--;
}while(en(junk,(*end)));
return(string_substring(string,0,end-string+1));
}
const char* string_trim(const char* string, char* junk){
return(string_trim_right(string_trim_left(string,junk),junk));}
int main(){
char * junk = "#_ ";
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], junk);
printf ("DEBUG: Despues:\t[%s]\n",result);}
return(0);
}
Re: Ayuda con punteros [C]
Author: Pascal Bourguignon
Date: Wed, 30 Aug 2006 15:06
Date: Wed, 30 Aug 2006 15:06
14 lines
1707 bytes
1707 bytes
"AnimAlf" <AnimAlf@engendro.sytes.net> writes: > Ahhh! Estoy leyendo en google i veo que no se public� ninguna > respuesta mia :(( no estiendo. > > La reenvio. Y gracias a todos por la ayuda :)) Mira mejor, hay tres respuestas. http://groups.google.com/group/es.comp.os.linux.programacion/browse_frm/thread/b5fe46047b709e60/a1e6c03413f37828?#a1e6c03413f37828 -- __Pascal Bourguignon__
Re: Ayuda con punteros [C]
Author: AnimAlf
Date: Sun, 10 Sep 2006 07:21
Date: Sun, 10 Sep 2006 07:21
26 lines
2067 bytes
2067 bytes
--=-FRI2LjmkTcQONecxTmEJ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable El dc 30 de 08 del 2006 a les 17:06 +0200, en/na Pascal Bourguignon va escriure: Si ya veo, dije m=C3=ADas --=-FRI2LjmkTcQONecxTmEJ Content-Type: application/pgp-signature; name=signature.asc Content-Description: =?ISO-8859-1?Q?Aix=F2?= =?ISO-8859-1?Q?_=E9s?= una part d'un missatge, signada digitalment -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (GNU/Linux) iQCVAwUARQO9BR535IyztBIVAQK/mAP/aTLSlIvxarr6co+ogbLxeudeUdPpzhR7 FqzOqvdmMQ9dYsAmRO07O+9TwiI6Xm5QplhJgt8MCL3qTDlnc9QTC9p9XrUuDkyp MqqKCkHCsRSZiu2Fct6ePTEdnXZooCm+jEFArzSN/pAaAL+W65v0nzH91H/6rWkA q/M7e3VBi+I= =S0cH -----END PGP SIGNATURE----- --=-FRI2LjmkTcQONecxTmEJ--
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads