Jump to content

Ajuda com separação de strings


einstein
 Share

Recommended Posts

Boas,

Gostava de alguma ajuda relativamente a como separar strings.

Então é assim, o utilizador pode escrever /pasta/ficheiro.extensao , ou entao só /ficheiro.extensao . o que eu nao consigo fazer é ler para várias strings o nome da pasta, o nome do ficheiro e a sua extensão. Só consigo fazer para um dos casos. Eu estava a pensar usar as funções fgets e sscanf mas não sei se assim vai resultar.

Link to comment
Share on other sites

Usa fgets() para obter o input.

Depois uma mistura de funções declaradas no header <string.h> para "descobrir" onde começa o nome do ficheiro, a extensão, cada pasta, ... etc conforme as necessidades.

Destaques:

strchr() procura um caracter, numa string.

strrchr() procura um caracter, numa string, do fim para o principio.

Atenção que a função strtok() tem algumas particularidades que a tornam dificil de usar correctamente sem conhecer essas particularidades (principalmente a função altera a string com que é chamada).

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Resumindo usas o strtok para te separar o caminho completo, em pedaços, pastas, ficheiros, para isso usas o caracter delimitador do strtok como o /

Atenção ao que já disseram, quando usar o strtok tens que guardar as strings da forma como melhor te convier.

Link to comment
Share on other sites

Obrigado, a todos pelas respostas só não percebi duas coisas. Se usar o strrchr() apenas consigo apanhar um caracter certo? Não consigo apanhar por exemplo uma coisa do género ".jpeg" ou entao so apenas uma string?

Em relação ao strok(), se tiver por exemplo (pasta/ficheiro/index.html) consigo separar em 3 strings diferentes certo?

Link to comment
Share on other sites

Se usar o strrchr() apenas consigo apanhar um caracter certo? Não consigo apanhar por exemplo uma coisa do género ".jpeg" ou entao so apenas uma string?

O que o strrchr() te faz é devolver um ponteiro para um caracter. Esse ponteiro pode (e normalmente é) ser interpretado como uma string. Podes trata-lo directamente ou copiar a string para outro lado.

char exemplo[] = "pasta/ficheiro/index.html";
char *ultimoponto;
ultimoponto = strrchr(exemplo, '.');
if (ultimoponto != NULL) {
    printf("A extensao é %s\n", ultimoponto + 1);
    /* substitui o ponto por um terminador de string */
    *ultimoponto = 0;
    printf("A string inicial mas sem extensao é %s\n", exemplo);
}

Em relação ao strok(), se tiver por exemplo (pasta/ficheiro/index.html) consigo separar em 3 strings diferentes certo?

O strtok() altera a string de input metendo-lhe uns terminadores em sitios especificos, tal como fiz no exemplo acima com o strrchr(). O que o strtok() devolve sao ponteiros que podes usar directamente ou copiar para outro lado.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

ah ok obrigado.

Descobri agora que é possivel usar uma função strstr para encontrar uma string dentro de outra.

Se eu fizer if(strstr(string1,".jpeg")!=0){

                printf("Tipo encontrado");

 if(strstr(string1,".jpeg")!=0){
                 printf("Tipo encontrado"); }

}

o meu programa  nao funciona porque?

Link to comment
Share on other sites

Então apareceu uma linha 'c:\......jpeg' e depois não apareceu 'Tipo encontrado' ? O bocado de código que meteste aqui tem duas chavetas de fecho para uma de abertura. Tens o código bem estruturado ?

O problema é que nem compila. Da estes erros : /usr/include/string.h:340: note: expected ‘const char *’ but argument is of type ‘int’

servidor.c:102: error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’

Link to comment
Share on other sites

Bem se aquilo que tu queres é apenas saber a extensao porque é que não ves a "pata" assim não estás dependente de funcões existentes mais complexas......

sem me preocupar muito com C o codigo seria algo do genero:

int estancao( char *fich){´
int r=1;
int i;
i=strlen(fich)-1;
while ( i>-1 && fich[i]!='.')
      i--;
if i=-1
r=0;
else
strcat(ext,fich[i]);
return(i);
}

Repara que o ext é uma variavel que terás de criar como geral e convinha que a apagasses sempre antes de chamares a função. Outra coisa que não tenho a certeza mas penso que tens de mandar &fich no strcat.

Link to comment
Share on other sites

O problema é que nem compila. Da estes erros : /usr/include/string.h:340: note: expected ‘const char *’ but argument is of type ‘int’

servidor.c:102: error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’

Como é que definiste a variavel "string1"?

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

A linha 102 do código é aquela do 'strstr' ?

P.S. Fizeste a inclusão da string.h ? (#include <string.h>)

Sim a linha 102 é a do strstr e sim fiz a inclusão do string.h.

Bem se aquilo que tu queres é apenas saber a extensao porque é que não ves a "pata" assim não estás dependente de funcões existentes mais complexas......

sem me preocupar muito com C o codigo seria algo do genero:

int estancao( char *fich){´
int r=1;
int i;
i=strlen(fich)-1;
while ( i>-1 && fich[i]!='.')
      i--;
if i=-1
r=0;
else
strcat(ext,fich[i]);
return(i);
}

Repara que o ext é uma variavel que terás de criar como geral e convinha que a apagasses sempre antes de chamares a função. Outra coisa que não tenho a certeza mas penso que tens de mandar &fich no strcat.

Aqui segundo o que percebi estás a criar uma função? Não consigo fazer sem criar uma função?

Para que fazes r=0, se i=-1?

Logo no inico porque fazer char *fich?

Como é que definiste a variavel "string1"?

É algo q o utilizador coloca no ecrã

Link to comment
Share on other sites

O problema é que nem compila. Da estes erros : /usr/include/string.h:340: note: expected ‘const char *’ but argument is of type ‘int’

servidor.c:102: error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’

Não podes fazer

array = strstr(texto, pesquisa);

Em C os arrays não são atribuiveis como um todo. Tens de alterá-los elemento-a-elemento ... ou com strcpy()

strcpy(array, strstr(texto, pesquisa)); // FALTA "ERROR CHECKING"

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Não podes fazer

array = strstr(texto, pesquisa);

Em C os arrays não são atribuiveis como um todo. Tens de alterá-los elemento-a-elemento ... ou com strcpy()

strcpy(array, strstr(texto, pesquisa)); // FALTA "ERROR CHECKING"

Com isto já é possivel armazenar a extenção? O que tu entendes por "ERROS CHECKING"?

Link to comment
Share on other sites

Com isto já é possivel armazenar a extenção?

Se fizeres tudo direitinho, sim.

O exemplo que apresentei está um bocadito incompleto: tens de adicionar o que falta, direitinho!

O que tu entendes por "ERROS CHECKING"?

Se procurares a extensão e ela não existir o strstr() devolve NULL. Não podes passar NULL para o strcpy().

Tens de verificar os erros ("check the errors"). É isso que "ERROR CHECKING" quer dizer: "VERIFICAÇÃO DE ERROS".

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

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
 Share

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