[l-desarrollo] convertir Cadena con delimitador a un array de cadenas

Ernesto Hernandez-Novich emhn at telcel.net.ve
Mon May 5 13:23:21 CDT 2003


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 <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list