Jump to content

duvida relativa a strings


sent
 Share

Recommended Posts

Boas,

sou novo em C, e estou com algumas duvidas:

1º relativa a função gets, li algures para não usar, qual a razão?

2º uma string e um array de chars e um array de string? e uma matriz de chars?

#include <stdio.h>
#include <string.h>
#define MAX 30

char* copia (char fra[],int prm,int ult)
     {
      int i,a;
      char palavra[MAX];
      for (i=prm,a=0;i<=prm;i++,a++) palavra[a]=fra[i]; 
      
      return (palavra);
            
     }

main (){
  char fra[MAX],lis[MAX][MAX];
  int i,a=0,ult,prm;
  
  printf ("introduza o texto: ");
  gets (fra); 
  prm=0;
  
  for (i=0;fra[i]!='\0';i++)
      {
       if (fra[i]=' ')
          { 
          ult=(i-1);
          lis[][a]=copia(fra,prm,ult);
          prm=(i+1);
          a++;
          }         
      }
  
  for (i=0;i<=(a-1);i++) printf ("\n%s",lis[][i]); 
      
}

isto não compila o objectivo era pegar numa frase e pola num array de strings palavra a palavra;

provavelmente de ser do (lis[][a]) [] sem nada;

sugestões?

obrigado desde já pela paciência; 

Link to comment
Share on other sites

1 - Pode causar buffer overflow porque não controla o tamanho do input. Já existe uma thread sobre isso criada pelo Localhost.

2 - Escreve direito com acentos. Não consigo perceber o que queres.

3 - Podes usar a função strtok, separando os tokens pelo caracter ESPAÇO, que facilita muito mais a tarefa.

Strabush, essa leitura está incorrecta por causa do operador &. Não se usa isso quando se trabalha com strings.

Link to comment
Share on other sites

sent, provavelmente o post que viste foi este

http://www.portugal-a-programar.pt/index.php?showtopic=34930

vai ver, de facto eh bom ganhar o habito de evitar o stack overflow

mas não eh algo que te precises de preocupar muito

se precisares mais alguma coisa... 😄

"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Link to comment
Share on other sites

já consegui fazer o que queria:

#include <stdio.h>
#include <string.h>
#define MAX 30


main (){
  char palavra[MAX];
  char fra[MAX],*lis[MAX];
  int i,a=0,ult,prm;
  
  printf ("introduza o texto: ");
  gets (fra); 
  prm=0;
   
  lis[a] = strtok (fra," ,.-");
  while (lis[a] != NULL)
  { 
    a++;
    lis[a] = strtok (NULL, " ,.-");//porque leva NULL aqui?
  }
  
for (i=0;i<=(a-1);i++) printf ("\n%s",lis[i]);
fflush (stdin);    
getchar();     
}


mas não percebi o porque de levar um NULL no sitio onde eu comentei...

alguém me pode explicar?

Link to comment
Share on other sites

A null pointer is returned if there are no tokens left to retrieve.

Não é essa a explicação, é esta:

In subsequent calls, the function expects a null pointer and uses the position right after the end of last token as the new starting location for scanning.
Link to comment
Share on other sites

isto eh engraçado xD

Ainda há 5 minutos estava a discutir com o meu prof ah pala disso

Pelos vistos o strtok, ah primeira vez que o chamas, faz o load da string que tu especificas no primeiro parametro.

Depois , vai ler a string até a um dos separadores que tu usaste, e returnar o endereço de memoria (ponteiro) para a string que leu (até ao separador)

Quando voltares a chamar a função, se não especifiares a string ele vai continuar a partir do sitio onde ficou da ultima vez

Portanto, passas NULL, para ele continuar onde ficou da ultima vez

Se voltasses a passar a string como fizeste na primeira vez, ele voltava ao inicio, e o token (retorno da função) seria sempre o mesmo

Já entendeste?

Espero ter esclarecido, boa programação 😄

"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Link to comment
Share on other sites

"In subsequent calls, the function expects a null pointer and uses the position right after the end of last token as the new starting location for scanning."

No fundo o que fiz foi traduzir e explicar melhor... no entanto eu e o meu professor de facto falamos disso ontem

A rasão para haver tanta confusão (penso eu) eq ninguem sabe onde a função vai guardar a posição de memoria onde ele ficou da ultima vez que pesquisou a string que foi passada ah função pela primeira vez... daí ser estranho

O meu prof disse-me que isso eh gerido pelo compilador directamente... Isso já não sei explicar

Seja como for, basta saberem que passando NULL a função vai continuar onde ficou da ultima vez 😄

"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

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.