| 
	
		|  Autor | Tema: [C] Funcion Split  (Leído 4,635 veces) |  
	| 
			| 
					
						| mr.blood 
								
								 Desconectado 
								Mensajes: 150
								
								
								
								
								
								   | 
 
Espero que a alguien le sirva. Yo no he visto fallos, si los encontrais, comentadlos por favor. #include <stdio.h>#include <malloc.h>#include <string.h> int len_palabra(char *cadena, int inicio, char separador);char **split(char *cadena, char separador); int main(){	char cadena[]="MrBlood.split.crea.funcion";	int i;	char **retorno=split(cadena, '.');	for(i=0;retorno[i]!=NULL;i++)	{	}	return 0;} int len_palabra(char *cadena, int inicio, char separador){	int len=0, i=inicio;	while(cadena[i]!=separador&&cadena[i]!='\0')	{		len++;		i++;	}	return len;} char **split(char *cadena, char separador){	int num_palabras=1,  len_cadena=strlen( cadena),  i,  j=1, * inicios;	for(i=0;i<len_cadena;i++)	{		if(cadena[i]==separador)		{			num_palabras++;		}	}	inicios=malloc(sizeof(int)* num_palabras);	inicios[0]=0;	for(i=1;i<len_cadena;i++)	{		if(cadena[i]==separador)		{			inicios[j]=i+1;			j++;		}	}	char **retorno=malloc(sizeof(char *)* num_palabras+1);	retorno[num_palabras]=NULL;	for(i=0;i<num_palabras;i++)	{		j=len_palabra(cadena, inicios[i], separador);		retorno[ i]=(char *)malloc(sizeof(char)* j);		strncpy(retorno[ i], & cadena[ inicios[ i]],  j);		retorno[i][j]='\0';	}	return retorno;} 
 Sa1uDoS EDITO: Ahora se libera la memoria reservada con malloc.
 
 |  
						| 
								|  |  
								| « Última modificación: 28 Marzo 2013, 18:00 pm por mr.blood » |  En línea | 
 
 |  |  |  | 
			| 
					
						| naderST | 
 
Esta bien pero recuerda que debes hacerle free a cada palabra y luego al retorno porque estas dejando memory leaks. Otra cosa, sería interesante que el delimitador pudiera ser un string. Aquí te dejo una que hice yo, pero en C++ mucho más sencillo utilizando la clase string y vector:http://gauss.com.ve/articulos/articulo.php?id=10
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| mr.blood 
								
								 Desconectado 
								Mensajes: 150
								
								
								
								
								
								   | 
 
En realidad aunque es una buena costumbre usar free, el SO se encarga de liberar la memoria reservada cuando el proceso termina   . Aun asi deberia mejorar eso. Sa1uDoS |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| naderST | 
 
En realidad aunque es una buena costumbre usar free, el SO se encarga de liberar la memoria reservada cuando el proceso termina   . Aun asi deberia mejorar eso. Sa1uDoSSí, pero que tal si mi proceso es un servidor que va a correr durante meses usando esa función split cada vez que recibe alguna petición? En cierto punto va a reventar. Fuera de eso, muy bueno el aporte. |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| durasno 
								 
								
								 Desconectado 
								Mensajes: 373
								
								
								
								
								
								   | 
 
Y para molestar un poco mas faltaria comprobar q malloc asigne memoria correctamente
 
 Saludos
 |  
						| 
								|  |  
								|  |  En línea | 
 
 Ahorrate una pregunta, lee el man |  |  |  | 
			| 
					
						| rir3760 
								       
								
								 Desconectado 
								Mensajes: 1.639
								
								
								
								
								
								   | 
 
Espero que a alguien le sirva. Yo no he visto fallos, si los encontrais, comentadlos por favor. Algunos comentarios: * Para tener acceso al prototipo de malloc es mejor, en lugar de <malloc.h>, incluir <stdlib.h> ya que este ultimo es parte de la biblioteca estándar de C. * Cuando reservas memoria para cada parte de la cadena debes utilizar "j + 1", el elemento adicional es para almacenar ahí el '\0'. * En lugar de copiar la cadena y a continuación almacenar manualmente el '\0': strncpy(retorno[ i], & cadena[ inicios[ i]],  j);retorno[i][j] = '\0';
 Puedes realizar los dos pasos con sprintf: sprintf(retorno[ i], "%.*s",  j,  cadena +  inicios[ i]);
 * En la función "len_palabra" puedes obtener el numero de caracteres utilizando solo una variable local, de esta forma: int len_palabra(char *cadena, int inicio, char separador){   int i = inicio;    while (cadena[i] != separador && cadena[i] != '\0')      i++;    return i - inicio;}
 Un saludo |  
						| 
								|  |  
								|  |  En línea | 
 
 C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.--
 Kernighan & Ritchie, The C programming language
 |  |  |  | 
			| 
					
						| mr.blood 
								
								 Desconectado 
								Mensajes: 150
								
								
								
								
								
								   | 
 
La funcion len_palabra puedo eliminarla y aprovechar el for donde busco los inicios, pero muy buen apunte. Luego cambio todo esto.Lo del sprintf ni se me ocurrio.
 
 Gracias a todos por los comentarios, en especial a @rir3760. Luego lo cambio y edito.
 
 Sa1uDoS
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | [batch] funcion split Scripting
 | z_ane_666 | 1 | 2,938 |  3 Enero 2011, 20:55 pm por xassiz~
 |  
						|   |   | [C]Función SPLIT Programación C/C++
 | Binary_Death | 7 | 5,640 |  4 Octubre 2011, 17:19 pm por Binary_Death
 |  
						|   |   | Función Split VB.NET .NET (C#, VB.NET, ASP)
 | R3Z | 7 | 6,989 |  4 Noviembre 2015, 05:03 am por R3Z
 |  
						|   |   | Consulta: Función Split Programación Visual Basic
 | jack06 | 4 | 3,524 |  9 Mayo 2017, 00:58 am por jack06
 |  
						|   |   | Función split para separar valores recibidos por un arduino .NET (C#, VB.NET, ASP)
 | Rupertito | 1 | 2,625 |  27 Noviembre 2019, 16:58 pm por Serapis
 |    |