Ir ao conteúdo
  • Cadastre-se

Passar struct como parametro


Matheus Perusso

Posts recomendados

tenho o seguinte código :

#include<stdio.h>
#include<string.h>
  int nc=0,*p=&nc;


  typedef struct{
   char pnome[100],unome[100];
   int cpf[12],numcadastro[100],senha[100];
   char endereco[100];
  }ficha;


  void cadastro(){
    __fpurge(stdin);
    printf("Digite seu primeiro nome: ");
    fgets(cliente[nc].pnome,100,stdin);
    printf("Digite seu segundo nome: ");
    fgets(cliente[nc].unome,100,stdin);
    
    printf("%d", nc);
  }







      int main(){
        int escolha;
        
          do {
          escolha=90;
          printf("\n       MENU LOCADORA DE VEÍCULOS     \n\n");
          printf("  (1) Cadastro de novos clientes\n");
          printf("  (6) Sair do programa\n");
          printf("\n Digite o número correspondente a sua ação :\n");
          scanf("%d", &escolha);




          switch (escolha){
            case 1:

                    cadastro();
                    printf("%s\n", cliente[nc].pnome);
                    printf("%s\n", cliente[nc].unome);
                    *p+=1;
                    break;


          }



        } while(escolha!=6);
          return(0);
        }

Quero saber, como eu passo essa struct como parametro para preencher esses essas strings dessa struct, para quando eu imprimir, fora e dentro da função, a string esteja preenchida com os mesmos nomes.

Link para o comentário
Compartilhar em outros sites

Pense na struct como se fosse qualquer outra variável:

- Se for uma variável simples passa a referência da variável e na função usa um ponteiro

- Se for um vetor passa o nome do vetor/matriz, e na função o parâmetro é um vetor/matriz de mesmo tamanho (ou um ponteiro que será iterado).

 

Ex:

#include <stdio.h>
#include <string.h>

typedef struct {
    char frase[100];
    int numero, vetor[2];
    
}teste;

void funcao(teste *z){
    strcpy((*z).frase, "texto da frase");
    (*z).numero = 123;
    (*z).vetor[0] = 50;
    (*z).vetor[1] = 77;
    
}

void funcao2(teste z[2]){
    strcpy(z[0].frase, "ABCDEFG");
    z[0].numero = 456;
    z[0].vetor[0] = 33;
    z[0].vetor[1] = 11;

    strcpy(z[1].frase, "hijklm");
    z[1].numero = 789;
    z[1].vetor[0] = 22;
    z[1].vetor[1] = 44;
}

int main()
{
    teste A, B[2];
    funcao(&A);
    printf("A:\n-Frase: %s \n-Numero: %d \n-1a posicao do vetor: %d \n-2a posicao do vetor: %d\n\n",
           A.frase, A.numero, A.vetor[0], A.vetor[1]);
    
    funcao2(B);
    printf("B[0]:\n-Frase: %s \n-Numero: %d \n-1a posicao do vetor: %d \n-2a posicao do vetor: %d\n\n",
           B[0].frase, B[0].numero, B[0].vetor[0], B[0].vetor[1]);
    printf("B[1]:\n-Frase: %s \n-Numero: %d \n-1a posicao do vetor: %d \n-2a posicao do vetor: %d\n\n",
           B[1].frase, B[1].numero, B[1].vetor[0], B[1].vetor[1]);
    
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Pelo que eu entendi, seria assim né:

#include<stdio.h>
#include<string.h>
  int nc=0,*p=&nc;



  typedef struct{
   char pnome[100],unome[100];
   int cpf[12],numcadastro[100],senha[100];
   char endereco[100];
  }ficha;



  void cadastro(ficha cliente[200]){
    __fpurge(stdin);
    ficha cliente[nc];
    printf("Digite seu primeiro nome: ");
    fgets(cliente[nc].pnome,100,stdin);
    printf("Digite seu segundo nome: ");
    fgets(cliente[nc].unome,100,stdin);
    printf("%s\n", cliente[nc].pnome);
    printf("%s\n", cliente[nc].unome);

    printf("\n%d\n", nc);
  }







      int main(){
        int escolha,cliente[200];


          do {
          escolha=90;
          printf("\n       MENU LOCADORA DE VEÍCULOS     \n\n");
          printf("  (1) Cadastro de novos clientes\n");
          printf("  (2) Cadastro de novos veículos\n");
          printf("  (3) Locação de carros\n");
          printf("  (4) Cadastro de novas filiais\n");
          printf("  (5) Movimentar carros\n");
          printf("  (6) Sair do programa\n");
          printf("\n Digite o número correspondente a sua ação :\n");
          scanf("%d", &escolha);




          switch (escolha){
            case 1:

                    cadastro(cliente);

                    printf("%s\n", cliente[nc].pnome);
                    printf("%s\n", cliente[nc].unome);
                    *p+=1;
                    break;


          }



        } while(escolha!=6);
          return(0);
        }

só que ta dando vários erros, o que eu fiz de errado?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Primeiro:

int cpf[12],numcadastro[100],senha[100];

Para que você quer armazenar 12 CPFs, 100 números de cadastro e 100 senhas em cada ficha? Imagino que sua intenção era fazer isso:

char cpf[12],numcadastro[100],senha[100];

Ou isso:

int cpf, numcadastro, senha;

Ou talvez isso?

int cpf, numcadastro;
char senha[100];

 

 

E não tentei compilar, mas o que você está tentando fazer aqui?

*p+=1;

E quando "nc" é incrementado?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

nc é o numero do cliente, cada vez que eu termino a execução no primeiro switch, ele incrementa um, usei um ponteiro pra incrementar porque eu precisa colocar um ponteiro, era requisito do trabalho, só coloquei pra ter um. Eu não fiz o cpf nem o resto, mas o cpf é um veto inteiro, senha e numero tb.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Os problemas maiores parecem ser aqui:

 void cadastro(ficha cliente[200]){
    __fpurge(stdin);
    ficha cliente[nc];

Onde você define "ficha cliente[]" 2 vezes na mesma função, uma vez com comprimento 200 como parâmetro de entrada da função, e outra com comprimento nc dentro da função. Esse segundo não deveria existir...

 

 

E aqui:

int main(){
  int escolha,cliente[200];

Onde você define cliente[] como sendo do tipo int, mas deveria ser do tipo ficha (a struct que você definiu).

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Consegui, valeu pela ajuda. Só tenho mais uma duvida, estou recebendo esses warnings:

locadora.c:150:30: warning: passing argument 1 of atoi from incompatible pointer type [-Wincompatible-pointer-types]
             vetsenha[k]=atoi(stroca);
                              ^~~~~~
In file included from locadora.c:2:0:
/usr/include/stdlib.h:108:12: note: expected const char *’ but argument is of type int *’
 extern int atoi (const char *__nptr)

Só que a função atoi está funcionando como deveria, tudo certo, como q eu tiro esses warnings?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O warning tá dizendo que você está passando tipo incompatível o com tipo esperado pela função atoi(), o parâmetro dele é um ponteiro constante de caracteres (const char *) mas você está passando um ponteiro inteiro (int *).

 

Daí estou concluindo que stroca é um vetor de inteiros, mas como discutimos em outro tópico atoi() é uma função para converter uma string (vetor de chars) de dígitos numéricos (Ex: "123") para um número inteiro (Ex: 123), logo não deve ser passado um vetor de inteiros para a função.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

***** uaheuaehuaehaeu, em todas as funções q eu fiz ela é char, menos na da senha, erro bobo, nem me liguei haha. Tem um warning da fpurge tb :

locadora.c: In function cadastro’:
locadora.c:17:5: warning: implicit declaration of function __fpurge [-Wimplicit-function-declaration]
     __fpurge(stdin);
     ^~~~~~~~

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Tá dizendo que você está usando uma função que não foi definida, nesse caso significa que você não incluiu as bibliotecas necessárias, acredito que __fpurge() precisa das bibliotecas stdio.h e stdio_ext.h... (Mas stdio_ext.h não é uma biblioteca padrão do C.)

 

Mas você não deveria usar isto para limpar a stdin o modo correto de limpar a stdin seria colocar no código algo como essa função e usá-la:

 

void limpastdin(){
    char c;
    while((c = getchar()) != '\n' && c != EOF);
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!