Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

sent

duvida relativa a strings

Mensagens Recomendadas

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; 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

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


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.