ptrci Posted November 29, 2007 at 02:54 PM Report Share #151141 Posted November 29, 2007 at 02:54 PM 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 More sharing options...
Warrior Posted November 29, 2007 at 03:17 PM Report Share #151149 Posted November 29, 2007 at 03:17 PM Para colocares aspas (") dentro de uma string em C deves precede-las de uma slash. Ou seja: char str[90] = "novo \"portugal a programar\""; Link to comment Share on other sites More sharing options...
TheDark Posted November 29, 2007 at 06:15 PM Report Share #151185 Posted November 29, 2007 at 06:15 PM 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. Desaparecido. Link to comment Share on other sites More sharing options...
ptrci Posted November 29, 2007 at 08:53 PM Author Report Share #151216 Posted November 29, 2007 at 08:53 PM 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"; Link to comment Share on other sites More sharing options...
ptrci Posted November 29, 2007 at 09:29 PM Author Report Share #151232 Posted November 29, 2007 at 09:29 PM 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 More sharing options...
Triton Posted November 29, 2007 at 09:34 PM Report Share #151234 Posted November 29, 2007 at 09:34 PM 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. <3 life Link to comment Share on other sites More sharing options...
mogers Posted November 29, 2007 at 09:41 PM Report Share #151237 Posted November 29, 2007 at 09:41 PM 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 More sharing options...
Triton Posted November 29, 2007 at 09:56 PM Report Share #151241 Posted November 29, 2007 at 09:56 PM 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 More sharing options...
mogers Posted November 29, 2007 at 10:36 PM Report Share #151264 Posted November 29, 2007 at 10:36 PM 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 More sharing options...
Triton Posted November 29, 2007 at 10:51 PM Report Share #151268 Posted November 29, 2007 at 10:51 PM 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 More sharing options...
mogers Posted November 29, 2007 at 11:06 PM Report Share #151273 Posted November 29, 2007 at 11:06 PM 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 More sharing options...
TheDark Posted November 30, 2007 at 12:40 AM Report Share #151295 Posted November 30, 2007 at 12:40 AM 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 More sharing options...
ptrci Posted November 30, 2007 at 01:11 AM Author Report Share #151299 Posted November 30, 2007 at 01:11 AM 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 More sharing options...
mogers Posted November 30, 2007 at 01:30 AM Report Share #151301 Posted November 30, 2007 at 01:30 AM 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 More sharing options...
ptrci Posted November 30, 2007 at 06:42 PM Author Report Share #151411 Posted November 30, 2007 at 06:42 PM mogers podias explicar o que é o eDelimitador ? Link to comment Share on other sites More sharing options...
mogers Posted November 30, 2007 at 08:36 PM Report Share #151436 Posted November 30, 2007 at 08:36 PM 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 More sharing options...
ptrci Posted December 2, 2007 at 06:38 PM Author Report Share #151798 Posted December 2, 2007 at 06:38 PM 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 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now