From emhn at telcel.net.ve Mon May 5 13:23:21 2003 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:37 2004 Subject: [l-desarrollo] convertir Cadena con delimitador a un array de cadenas In-Reply-To: <200305051040.41416.acrraidx@lycos.es> Message-ID: On Mon, 5 May 2003, AcrraidX wrote: > Eso; si hay alguna funci?n de la biblioteca estandar que sirva para > convertir una cadena con alg?n delimitador a un array de cadenas, > por ejemplo: No. > si tengo la cadena "mandarina,cambur,auyama,kiwi", convertirla a un > array de 2 dimensiones de 4 x 10 posiciones (el nueve sale de "mandarina" > ya que es la cadena m?s larga y el cuatro porque hay 4 cadenas separadas > por comas ("," que es el delimitador)) de forma que quedara as?: > > ------------------------------------------------------ > | 'm' | 'a' | 'n' | 'd' | 'a' | 'r' | 'i' | 'n' | 'a' |'\0'| > ------------------------------------------------------ > | 'c' | 'a' | 'm' |'b' | 'u' | 'r' |'\0'| | | | > ------------------------------------------------------ > | 'a' | 'u' | 'y' |'a' |'m' | 'a'|'\0'| | | | > ------------------------------------------------------ > | 'k' | 'i' | 'w' | 'i' |'\0' | | | | | | > ------------------------------------------------------ En C/C++ tienes que escribirla tu mismo. O usas un lenguaje de alto nivel como Perl. Con la precondici?n my $cadena = "mandarina,cambur,auyama,kiwi"; my @letras = (); la soluci?n m?s "terrenal" es obviamente una doble iteraci?n con manipulaci?n expl?cita de cadenas, y no la voy a escribir porque es rid?culo. La soluci?n m?s simple "estilo Perl" que se me ocurre es for (split /,/, $cadena) { push(@letras,[ map { split //,$_ } $_ ]); # [1] } Y luego puedes usar print $letras->[2]->[4],"\n"; que muestra 'm' de 'auyama', o bien puedes usar for (@letras) { for (@{$_}) { print "$_ "; } print "\n"; } que muestra todas las palabras "letra por letra". N?tese que no necesito saber cu?ntas palabras hay ni de cu?ntas letras es cada una; el lenguaje "sabe". [1] Aunque no es obvio _no_ hay ninguna ambig?edad en el uso del contextualizador $_. El primero es relacionado a la iteraci?n impl?cita del map, el segundo es relacionado a la iteraci?n expl?cita del for. Eso sugiere que no necesito el for, y puedo iterar impl?citamente para la separaci?n en letras (detesto los efectos laterales de la programaci?n imperativa :-), lo cual nos lleva a la soluci?n m?s elegante, compacta y eficiente map { push(@letras,[ map { split(//,$_) } $_ ]) } split(/,/,$cadena); El exceso de par?ntesis alrededor de split es para no confundir a los newbies pues no hacen falta, esto es, puede quedar como map { push @letras,[ map { split//,$_ } $_ ] } split/,/,$cadena; Gracias programaci?n funcional por los favores recibidos. -- Ernesto Hern?ndez-Novich - Running Linux 2.4.19 i686 - Unix: Live free or die! Geek by nature, Linux by choice, Debian of course. If you can't apt-get it, it isn't useful or doesn't exist. GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3 ?Sabe leer? Elimine mi firma de sus respuestas; s? qui?n soy ;) ------------------------------------------------------------------------ Enviar e-mail a colocando en el cuerpo: "UNSUBSCRIBE caracas-pm-list" para desuscribirse. "INFO caracas-pm-list" para conocer las reglas de etiqueta. ------------------------------------------------------------------------