Ir para o conteúdo
ptrci

Dividir uma string(consunto de caracteres) em dois

Mensagens Recomendadas

ptrci    0
ptrci

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Warrior    68
Warrior

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

Ou seja:

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
TheDark    0
TheDark

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ptrci    0
ptrci

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";

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ptrci    0
ptrci

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, " ,");
        }

    }

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mogers    14
mogers

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mogers    14
mogers

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Triton    12
Triton

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mogers    14
mogers

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  ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
TheDark    0
TheDark

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ptrci    0
ptrci

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 }

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mogers    14
mogers

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mogers    14
mogers

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ptrci    0
ptrci

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

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade