C split
Publicado por Enzo de Brito Ferber (última atualização em 23/01/2013)
[ Hits: 6.084 ]
Homepage: http://www.maximasonorizacao.com.br
Download split.tar (versão 2)
Download 1358166997.split.tar (versão 3)
Função parecida com a split() do JavaScript.
$ gcc -o split split.c
$ ./split
Pode-se excluir a função main desse fonte, e usá-lo como "include" em outros projetos:
$ gcc -c split.c
$ gcc split.o meu_programa.o -o meu_programa
No 'meu_programa' basta chamar a função.
Versão 2 - Enviado por Enzo de Brito Ferber em 21/12/2012
Changelog: Script menor e melhor.
Atualização para trabalhar com pipes na linha de comando.
Um exemplo muito bom de como pode ser usado é:
$ echo $LS_COLORS | split
Irá mostrar uma extensão por linha das definições de cores do 'ls'.
O programa agora aceita apenas 1 argumento (opcional), e o primeiro caractere desse argumento é o separador.
O default é ':' (o join também).
Versão 3 - Enviado por Enzo de Brito Ferber em 14/01/2013
Changelog: Função menor, mais clara e melhor.
O programa agora lê da entrada padrão, stdin, o que faz a integração com a linha de comando do linux(pipes) muito boa.
/* 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;
}
Programa para demonstrar operadores
Pra quem gosta de RPG. Um sistema de lutas.
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
É normal não gostar de KDE? (15)
Erro ao instalar programa, "você tem pacotes retidos quebrados&qu... (13)









