Split em C

1. Split em C

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/12/2005 - 17:31h

Fala ae pessoal eu to com uma dúvida aqui, alguêm conhece uma lib em C que faça um split estilo o do PHP ?


  


2. Re: Split em C

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/12/2005 - 18:16h

Beleza pessoal, acho que eu já resolvi. Se alguêm precisar.

int strSplit(char *strTOsplit,char *strArr[], char *strSeparet,int nArr)
{
int i = 0;
char * pch;

pch = strtok (strTOsplit,strSeparet);
for(i = 0;i < nArr;i++)
{
//printf ("%s\n",pch);

strArr[i] = pch;
pch = strtok (NULL,strSeparet);
}
}



3. Re: Split em C

AkiraGTR
akiragtr

(usa Ubuntu)

Enviado em 30/03/2008 - 21:34h

Valeu, usei no meu trabalho...


4. Re: Split em C

AkiraGTR
akiragtr

(usa Ubuntu)

Enviado em 30/03/2008 - 22:26h

o retorno neste caso tem que ser void


5. Re: Split em C

Newton Teixeira
NewtonJr.

(usa CentOS)

Enviado em 17/08/2009 - 11:42h

Tô precisando usar esse split para transformar uma string horaria (HH:MM:SS) em numero de segundos, porém na execução tah dando erro direto. Eis a função.

int ConvertStringHoraToSegundos(char* hora) {

char *vetor;
char *aux[]={"","",""};
char separador[] = {":"};
int total, hora_nsegundos, minuto_nsegundos, segundos;

system("cls");
printf("\nhora - %s\n",hora);
getchar();

strSplit(hora,aux,separador,3);
printf("\n\n\n vetor - %s \t aux - %s",vetor,aux);
getchar();

hora_nsegundos = atoi(vetor[0]);
minuto_nsegundos = atoi(vetor[1]);
segundos = atoi(vetor[2]);
total = (hora_nsegundos * 3600) + (minuto_nsegundos * 60) + segundos;
return total;
}


Onde estou errando nesse código ao usar o Split informado. Fico no aguardo. Att.


6. Re: Split em C

André
andrezc

(usa Debian)

Enviado em 17/08/2009 - 12:09h

Cade as bibliotecas ?


7. Re: Split em C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 20/12/2011 - 12:31h



/* split.c
*
* Enzo Ferber
* dez 2011
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/* poscpy()
*
* @t = target string (should be malloc(a + b + 1))
* @s = source string
* @a = startpoint in source string (must be > 0 )
* @b = endpoint in source string (must be < strlen(s))
*
* @function
* copys s[a] -> s[b] into t.
*
*/

void poscpy ( char *t, char *s, int a, int b )
{
while ( a < b ) *(t++) = *(s + (a++));
*t = 0x0;
}

char **split ( char *str, char n, int *length )
{
register int i, j, a;

/* control */
int len = strlen(str);
int elements = 0, elpos = 0;

char **array;

/* number of new itens in array */
for ( i = 0; i < len; i++ ) if ( str[i] == n ) elements++;

/* get the memory */
array = ( char ** ) calloc ( elements , sizeof(char *));

if ( !array )
{
printf ( "# Error in malloc(*).\n" );
return NULL;
}

/* the number of elements for the caller */
*length = elements;

/* lvl1
*
* @i = will be the start point for copy
*/
for ( i = 0; i < len; i++ )

/* lvl2
*
* @j = will be end point for copy
*/
for ( j = i; j <=len; j++ )

/* found splitChar or EoL */
if ( str[j] == n )
{
/*
* @i has start point
* @j has end point
*/

array[ elpos ] = ( char *) malloc ( (j - i + 1) * sizeof(char));

if ( !array[ elpos ] )
{
printf ( "# lvl2\n");
printf ( " # Error in malloc().\n" );
return NULL;
}

/* copy the string into the array */
poscpy ( array[ elpos ], str, i, j );

/* increment array position */
elpos++;

/* after the copy is done,
*
* @i must be equal to @j
*/
i = j;

/* end loop lvl2 */
break;
}

/* return array */
return array;
}

int main ( void )
{
int len, i;
char *str = "Enzo:de:Brito:Ferber:Viva:O:Linux:A:Maior:Comunidade:Linux:da:America:Latina!:";
char **elements = split(str, ':', &len);

// reference pointer
char **a = elements;

printf ( "# Elements: %d\n", len );

while ( *a ) printf (" # %s\n", *(a++));

return 0;
}


Enzo Ferber
[]'s


8. Re: Split em C

Newton Teixeira
NewtonJr.

(usa CentOS)

Enviado em 20/12/2011 - 12:39h

Enzo ,seu código divide a função em tokens perfeitamente, mas ao final exibe um erro e o programa é fechado pelo S.O.

Compilei e executei seu código no DevC++ e no CodeBlocks. O SO que testei é o Win XP.

Testa ai e me diz o que pode ser esse erro. Estou no aguardo. Att.


9. Re: Split em C

Daniel Lara Souza
danniel-lara

(usa Fedora)

Enviado em 20/12/2011 - 12:57h

testei no linux e ficou 100%


10. Re: Split em C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 20/12/2011 - 14:06h

Também fiz no linux cara...

Aqui na empresa só tenho Win7, e o Dev não roda no Win7.

Quando chegar em casa vejo no notebook. Vou olhar aqui o que pode ser.


11. Re: Split em C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 20/12/2011 - 14:08h

NewtonJr. escreveu:

Enzo ,seu código divide a função em tokens perfeitamente, mas ao final exibe um erro e o programa é fechado pelo S.O.

Compilei e executei seu código no DevC++ e no CodeBlocks. O SO que testei é o Win XP.

Testa ai e me diz o que pode ser esse erro. Estou no aguardo. Att.


Ela chega a exibir os itens, e depois que exibe tudo dá um Segmentation Fault?

Se for, troca o while() por:


for ( i = 0; i < length; i++ ) printf ( "# %s\n", a[i] );



Tenta ai
;)


12. Re: Split em C

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 20/12/2011 - 14:25h

Ah!

Mais uma coisa,

Pra usar essa função, todos os elementos devem ser sucedidos pelo caractere separador,

Ou seja,


char **s = split("enzo:ferber:", ':', &len);


Vai retornar "enzo", e "ferber".

Mas,


char **s = split("enzo:ferber", ':', &len );


Vai retornar só "enzo"


;)



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts