Jump to content

Dividir uma string(consunto de caracteres) em dois


ptrci

Recommended Posts

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

Link to comment
Share on other 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, " ,");
        }

    }
Link to comment
Share on other 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 😛   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...

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Mas o memcpy é mais rápido 😛   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.

<3 life

Link to comment
Share on other 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

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other 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.

<3 life

Link to comment
Share on other 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  😉

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other 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.

Desaparecido.

Link to comment
Share on other 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 }

Link to comment
Share on other 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

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other 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...

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.