sisoputnfrba / so-commons-library

TADs de uso comun en aplicaciones desarrolladas en C
http://sisoputnfrba.github.io/so-commons-library/
GNU General Public License v3.0
106 stars 175 forks source link

Bug en string split con separadores de mas de un caracter #141

Closed study64 closed 3 years ago

study64 commented 3 years ago

//Con un separador de un único caracter funciona bien char **partes = string_split("Hola|Mundo", "|"); puts(partes[0]);//Hola puts(partes[1]);//Mundo

//Cuando se utiliza un separador de mas de un caracter char **partes = string_split("Hola||Mundo", "||"); puts(partes[0]);//Hola puts(partes[1]);//null

RaniAgus commented 3 years ago

¡Buenas! Gracias por reportarlo :)

Quizás no sea exactamente un bug, ya que string_split(2) y string_n_split(3) usan la función strsep(3), la cual considera a cada caracter como un separador distinto. En tu caso, sería lo mismo que incluir un solo "|":

string_split("Hola||Mundo", "||"); => ["Hola", "", "Mundo", NULL]
string_split("Hola||Mundo", "|");  => ["Hola", "", "Mundo", NULL]

Igual concuerdo en que es mucho mejor contar con la feature de usar delimitadores de varios caracteres, pueden usar el código que subí a #142 (les recomiendo agregarlo así como está a su biblioteca compartida ya que puede que no lo mergeemos hasta el próximo cuatri).

¡Saludos!

RaniAgus commented 3 years ago

PD: Ojo con cómo están leyendo los arrays de strings, al parecer están confundiendo "array vacío" con null (de hecho, si a puts() le pasan null rompe). Por si les sirve de ayuda, yo lo leería usando string_iterate_lines(2):

char** strings = string_split("Hola||Mundo", "||");
string_iterate_lines(strings, (void*) puts);
study64 commented 3 years ago

Si tenés razón es un vacío no un null lo que queda en la segunda posición. Justamente yo asumí que funcionaba como el split de js o el explode de php. Gracias