• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ptrci

Dividir uma string(consunto de caracteres) em dois

17 mensagens neste tópico

Ola a todos,

Estou a tentar criar um split, tudo o que encontro é para java e c#, tento implementar em C mas devo estar a fazer uma coisa mal.

Vou explicar o que estou a tentar fazer

Estou a receber uma string (char  st[90] )

Insiro isto  ( novo "texto"), e estou a tentar que o "novo" fique numa nova string e o que esta enter  [ " ]  fique noutra.

exemplo:

str[90] = { novo " portugal a programar "}

str1[10]  ->  novo

str2 [30]  ->  portugal a programar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para colocares aspas (") dentro de uma string em C deves precede-las de uma slash.

Ou seja:

char str[90] = "novo \"portugal a programar\"";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi o que estás a tentar fazer, mas para copiar substrings tens que usar o memcpy.

Um pouco de código do que estás a tentar fazer ajudava a compreender.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou a inserir uma string que é a seguinte:  nome "texto"

e quero dividir em duas:

1 - e tudo até ao primeiro " ou seja fica: nome

2 - e tudo o que esta entre ( " ) ou seja fica: texto

um exemplo mais explicito:

Nomes = João " Maria Saulo ";

gostaria de armazenar no array assim:

Nome0="João";

Nome1="Maria Saulo";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

este código funciona mas estou ao alterar estou a fazer mal ( eu sei que é muito simples mas a esta hora a volta disso já troco tudo":

void command_spliter ()
    {
        int i=0;

        char str="portugal a programar";
        char *p;

        scanf("%s",str);
        fflush(stdin);

        p = strtok (str," "); 


        while (p != NULL)
        {
            printf ("%s\n", p);
            p = strtok (NULL, " ,");
        }

    }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi o que estás a tentar fazer, mas para copiar substrings tens que usar o memcpy.

Para string handling existe o strcpy.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi o que estás a tentar fazer, mas para copiar substrings tens que usar o memcpy.

Para string handling existe o strcpy,

Mas o memcpy é mais rápido :P  E funciona para qualquer tipo de dados ;)

Acerca do split, eu acho que não fazia mal nenhum escreveres o código todo por ti sem o strtok...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas o memcpy é mais rápido :P  E funciona para qualquer tipo de dados ;)

O strcpy copia a string até ao caracter NULL, eu acho mais fácil de usar.

Quanto à velocidade, como tinha alguma curiosidade sobre o assunto, andei a pesquisar.

http://lists.canonical.org/pipermail/kragen-discuss/2002-January/000725.html

http://www.thescripts.com/forum/thread212738.html

Como podes ver nos sites, a velocidade das funções depende de muitos factores... mas o strcpy em muitos casos consegue ser mais rápido que o memcpy.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que vejo nesses links, o strcpy é mais rápido em strings pequenas (Len < 100). E isso faz sentido. Eu não sei bem como é que é imprementado o strcpy (copia mais do que um byte de cada vez?). Pelo que sei, o memcpy copia varios bytes de cada vez (provavelmente 16 ou 32), assim, copia os bytes em multiplos de 16 ou 32 e depois deve copiar os restantes sequencialmente. Por isso é que para strings com 10 caracteres nunca compensa...

Eu costumo usar memcpy ou memset quando o tamanho dos dados é grande, tipo matrizes ou arrays (incluo os arrays de caracteres) , geralmente com 100kb ou mais... daí que penso que é bastante mais rápido

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu costumo usar memcpy ou memset quando o tamanho dos dados é grande, tipo matrizes ou arrays (incluo os arrays de caracteres) , geralmente com 100kb ou mais... daí que penso que é bastante mais rápido

Exacto, nesse caso também concordo com o seu uso! ;)

Mas para simples operações simpels de strings mais vale usar o strcpy, mais pela facilidade na leitura do código.

Quanto à implementação, pelo menos no glibc, o strcpy é implementado copiando caracter a caracter até encontrar '\0'.

O memcpy é parecido com o que tu dizes, dependendo do tamanho e do alinhamento do material a copiar, utiliza WORD, PAGE, ou BYTE copy.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu disse 16 ou 32 bytes porque no semestre passado, num dos trabalhos em que usei C e Assembly (IA32), fiz um memcpy em Assembly usando instruções MMX (isto é, copiando 8 bytes de cada vez), e a minha função em Assembly é bastante mais lenta do que o memcpy. Na altura fiquei curioso, mas não fui investigar como é que era implementado... tava mais preocupado em acabar o trabalho lol  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para string handling existe o strcpy.

Neste caso o strcpy não serve porque ele não quer copiar a string toda, não tem a ver com velocidade mas com o facto de que ele não quer copiar até encontrar '\0', mas até um certo ponto na string.

Neste caso eu aconselhava a usar a função strchr para encontrar o 1º " e copiar do início até aí para uma string (com o memcpy, não esquecendo de meter um '\0' como último caracter), e depois a função strcpy para copiar o resto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto não pretendo copiar a string toda. pretendo dividir a string em dois, usando como  delimitador  \"

Eu estava a tentar usar o strtok mas este só aceita os seguintes delimitadores:  .,;:!-

Portanto voltei a estaca zero.

Vou tentar explicar então o que quero

Tenho a string: ( Portugal "a programar" ) o que o programa vai fazer é criar duas strings da string recebida em que a primeira vai ter o conetudo ( portugal ) a segunda ( a programar).

str original =  { Portugal "a programar" }

str um =  { Portugal }

str dois = =  { a programar }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Neste caso o strcpy não serve porque ele não quer copiar a string toda, não tem a ver com velocidade mas com o facto de que ele não quer copiar até encontrar '\0', mas até um certo ponto na string.

Existe sempre o strncpy, para copiar n caracteres.

Eu faria a minha própria pesquisa na string original tendo um array de strings. Tens o indice da string actual e vais copiando para lá os caracteres. Quando encontras um caracter delimitador terminas a string actual com '\0' e passas à proxima.

Uma espécie de código e pseudo-código...

char original[MAX_LEN]  ,  st[MAX_STRINGS][MAX_STRING_SIZE];

int index = 0 , pos = 0 , i = 0;

while ( original[i] != '\0' )
if ( eDelimitador( original[i] ) )
	st[index][pos] = '\0'		
	index = index + 1
	pos = 0 
else
	st[index][pos] = original[i]
	pos = pos + 1

i = i + 1

if ( pos > 0 )
st[index][pos] = '\0'		
index = index + 1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A minha ideia era uma função que dizia se o caracter era um caracter delimitador.

Podia ser útil se tivesses mais do que um caracter possivel para delimitador, se forem só as aspas, compara directamente logo no if...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Afinal o strtok funciona com o delimitador \", eu é que estava a definir mal .

Alguém sabe como guardar os resultados do strtok em vários arrays

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora