Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

sent

duvida relativa a strings

Recommended Posts

sent

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; 

Share this post


Link to post
Share on other sites
Strabush

Eu quando quero por um conjunto de caracteres dentro de um vector de chars, pois em C não há strings, faço o seguinte:

char fra[MAX];

puts("texto: ");
scanf("%[^\n]", &fra);

Share this post


Link to post
Share on other sites
Baderous

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.

Share this post


Link to post
Share on other sites
sent

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?

Share this post


Link to post
Share on other sites
Baderous

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.

Share this post


Link to post
Share on other sites
pinguim

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 :D


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

Share this post


Link to post
Share on other sites
pinguim

"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 :D


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

Share this post


Link to post
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

×

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.