🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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]
#810
Author: AnimAlf
Date: Wed, 23 Aug 2006 04:05
78 lines
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]
#811
Author: 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!"
Re: Ayuda con punteros [C]
#812
Author: Claudio
Date: Wed, 23 Aug 2006 11:53
30 lines
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]
#813
Author: iarenaza
Date: Wed, 23 Aug 2006 12:00
33 lines
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]
#828
Author: AnimAlf
Date: Wed, 30 Aug 2006 14:50
116 lines
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]
#829
Author: Pascal Bourguignon
Date: Wed, 30 Aug 2006 15:06
14 lines
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]
#870
Author: AnimAlf
Date: Sun, 10 Sep 2006 07:21
26 lines
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