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

Lemur

duvida com strings e estruturas

8 mensagens neste tópico

Boas, tive a pesquisar mas não encontrei nada que me pudesse ajudar.

Estou a fazer um trabalho em C, em que tenho que criar um editor de texto.

Neste momento estou com uma dúvida em relação a colocar uma string (uma frase) dentro de uma estrutura, criei um ciclo para que a medida que o usuário vai escrevendo vai guardando na estrutura.

Começo só por tentar por uma linha de texto na estrutura, mas nem isso estou a conseguir.

#include <stdio.h>
#include <stdlib.h>

typedef struct
{      
       char linha[25];
       char col;
}TXT1;


menu()
{
      int x;
      printf("Escolha opcao:1-novo ou 2-view\n");
      scanf("%d",&x);
      if(x==1)
      novo();
      
}
novo(TXT1 *ptr)
{ 
          
  int i;
  char esc;
  char txt[79];
  printf("Introduza texto, caso queira terminar o seu texto, pressiona ENTER numa linha em branco");
       for(i=0;i<25;i++)
                   {
                    printf("--> ");
                    gets(txt);                      
                    *ptr.linha[i]=txt;
                   /*if(linha=='\0')
                   {
                   menu();
                   } */                
                   }
       
  printf("ver texto?");
  scanf("%c",&esc);
  if (esc='S')
  {
  printf("---\n\n\%s",txt);
  }
  printf("sair do prog");
  system("PAUSE");
  
}  	

view()
{
  //printf("Texto 1: \n%s", txt);
}

main()
{
   menu();  

}

o erro que me surge: "31  request for member `linha' in something not a structure or union"

ora tenho la a estrutura, tenho la o apontador a enviar para a linha...

acho que se souber fazer isto, depois já consigo fazer para varias linhas, penso eu...

Agradecia a vossa ajuda e peço desculpa pelo "amadorismo" =p

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(*ptr).linha = ....

O compilador tava a aceder ao apontador e depois desreferenciar... têns vários erros no código... tenho k sair do pc... se precisares de ajuda, diz

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá.

Tens vários erros e algum código que NUNCA deve ser usado. O código que está abaixo foi alterado a partir do teu para corrigir apenas o teu erro e os warnings que o gcc (em linux) gerou. Espero que dê uma ajuda para continuares o teu trabalho.

Relativamente ao teu código e aos erros que tinhas:

  • Tinhas várias funções sem tipo de retorno, nem parâmetros, nem tão pouco protótipos para o pré-processador C analisar. Isto não é boa prática, ok?
  • TInhas na função menu() uma chamada à função novo() sem parâmetros quando a tinhas declarado para receber um apontador para a estrutura TXT1, o que também não é muito bom apesar de não constituir um erro na compilação. Deves sempre passar os argumentos com o mesmo tipo que declaras nos protótipos das funções.
  • O erro que tinhas deve-se a estares a usar mal a precedência de operadores C. O operador . tem precedência sobre o operador * de desreferenciação. Isto resolve-se usando parêntesis à volta da desreferenciação que estavas a fazer

(* ptr).linha[i]

  • ou usando o operador -> directamente no apontador como está no código abaixo.
  • Nunca uses a função gets(). Esta função não tem um mecanismo de controlo da quantidade de bits que lê, pelo que pode perfeitamente causar uns crashes simpáticos sem perceberes porquê, dependendo do que estejas a colocar no input. Usa a função fgets() em vez da gets() sempre que possível.
  • Por fim, e sem querer perder muito tempo, nunca uses um system("pause"). Se queres que o teu programa páre e fique à espera de input usa um getchar() que faz exactamente o que pretendes de uma forma standard, mais leve para o teu sistema operativo, e para além disso é portável. Em linux não existe o comando pause e como tal o teu código não é compatível com este sistema operativo. Imagina que toda a gente usava linux e tinhas um código fantástico que até tirava cafés: só que ninguém podia usar o teu código por não ser portável... estás a ver o cenário certo?  :biggrin:

Com isto, espero que sirva de incentivo a melhorares o teu código e a obteres o resultado que pretendas. No código abaixo só está corrigido o teu erro e os warnings da compilação.

#include <stdio.h>
#include <stdlib.h>

/* estrutura TXT1 */
typedef struct
{      
       char linha[25];
       char col;
}TXT1; 

/* prototipos */
void menu(void);
void novo(TXT1 *ptr);
void view(void);

void menu(void)
{
      int x;
      TXT1 teste, *testePtr;
      
      testePtr = &teste;
      printf("Escolha opcao:1-novo ou 2-view\n");
      scanf("%d",&x);
      if(x==1)
      	novo(testePtr);
      
}

void novo(TXT1 *ptr)
{ 
          
  int i;
  char esc;
  char txt[79];
  printf("Introduza texto, caso queira terminar o seu texto, pressiona ENTER numa linha em branco");
       for(i=0;i<25;i++)
                   {
                    printf("--> ");
                    fgets(txt,79,stdin);                      
                    ptr->linha[i]=(int)txt;
                   /*if(linha=='\0')
                   {
                   menu();
                   } */                
                   }
       
  printf("ver texto?");
  scanf("%c",&esc);
  if (esc=='S')
  {
  printf("---\n\n\%s",txt);
  }
  printf("sair do prog");
  //system("PAUSE");
  getchar();
  
}  	

void view(void)
{
  //printf("Texto 1: \n%s", txt);
}

int main(void)
{
   	menu();  

return 0; 
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O facto de nao ter colocado tipo de retorno, depende do compilador. Eu penso (não tendo a certeza) que até faz parte do standard do C. O compilador deve assumir void.

Não sou apologista de postar código com erros resolvidos, mas esse código tb tem um erro

fgets(txt,79,stdin);                      
ptr->linha[i]=(int)txt;

isto guarda o valor do apontador (que quase de certeza que não cabe num char)... não me parece que seja isso que ele quer. Suponho que queira copiar o texto, mas esse ciclo até 25.. não percebi a ideia

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O facto de nao ter colocado tipo de retorno, depende do compilador. Eu penso (não tendo a certeza) que até faz parte do standard do C. O compilador deve assumir void.

O compilador assume int se não estou em erro. De qualquer forma, é boa prática colocar os tipos de retorno para pelo menos retirar esse trabalho ao compilador.

Eu também não sei bem o que é pretendido com o código, apenas pensei em retirar o warning de forma a não causar impacto na compilação, só isso.  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O compilador assume int.

E nos protótipos não é necessário colocar os nomes dos parâmetros, apenas os tipos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E nos protótipos não é necessário colocar os nomes dos parâmetros, apenas os tipos.

Sim, é verdade que não é obrigatório colocar os nomes dos parâmetros nos protótipos. Mas é uma boa norma fazê-lo porque se os nomes para os parâmetros forem bem escolhidos só ajuda à documentação e a perceber rapidamente o que é que determinada função faz e o que é que cada parâmetro representa. E isso não se consegue só com os tipos dos parâmetros sem qualquer nome.  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E nos protótipos não é necessário colocar os nomes dos parâmetros, apenas os tipos.

Sim, é verdade que não é obrigatório colocar os nomes dos parâmetros nos protótipos. Mas é uma boa norma fazê-lo porque se os nomes para os parâmetros forem bem escolhidos só ajuda à documentação e a perceber rapidamente o que é que determinada função faz e o que é que cada parâmetro representa. E isso não se consegue só com os tipos dos parâmetros sem qualquer nome.  :P

Tens toda a razão! É sempre uma boa prática colocar os nomes dos paramêtros por todas as razões que referiste.

0

Partilhar esta mensagem


Link 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