Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com Função e Structs


Fabin

Pergunta

Bom dia pessoal!

O meu problema é banal porem não sei como resolver, sempre que compilo o programa ocorre o erro:

incompatible types in assignment of `char' to `char[20]'
estou fazendo aos poucos meu codigo, estou fazendo as funçoes e testando. ta ai o codigo
#include <stdlib.h>
#include <stdio.h>

typedef struct
{
        char nome[20];
        char telefone[14];
}contato;

void limpar_agenda(contato x[10]);

int main()
{
    contato agenda[10];
    
    limpar_agenda(agenda);
    system("pause");
    return 0;
}

void limpar_agenda(contato x[10])
{

     for(int posicao=0;posicao<10;posicao++)
     {
             x[posicao].nome = '';
             x[posicao].telefone = '';
     }
     printf("Agenda Apagada!");
}

vlaews pela ajuda

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Olá Fabin,

No seu for o uso de x[posicao].nome = ' ' está incorreto, o mesmo vale pra .telefone = ' '.

Isso porque um array de bytes pra ser usado assim precisa ser indexado, ou seja, você teria que ter outra variavel pra fazer:

for (int a = 0; a < 20; a++)
   x[posicao].nome[a] = ' ';
for (int b = 0; b < 14; b++)
   x[posicao].telefone[b] = ' ';
Mas isso não é muito pratico, então você pode usar o strcpy() pra zerar suas variaveis do tipo array de bytes.
strcpy(x[posicao].nome, "");
   strcpy(x[posicao].telefone, "");
Também pode usar o memset() pra preencher um conteudo de memória. Eu coloquei as duas opções no seu código. qualquer dúvida fala ai. Abs
#include <stdlib.h>
#include <stdio.h>
#include <mem.h>
#include <string.h>

typedef struct
{
        char nome[20];
        char telefone[14];
}contato;

void limpar_agenda(contato x[10]);
void limpar_agenda2(contato *x, int items);

int main()
{
    contato agenda[10];
    
    limpar_agenda(agenda);
    limpar_agenda2(&agenda[0], 10);
    system("pause");
    return 0;
}

void limpar_agenda(contato x[10])
{
     for(int posicao=0;posicao<10;posicao++)
     {
             strcpy(x[posicao].nome, "");
             strcpy(x[posicao].telefone, "");
     }
     
     printf("\nAgenda Apagada!\n");
}

void limpar_agenda2(contato *x, int items)
{
    memset(x, 0, sizeof(contato) * items);
    printf("\nAgenda Apagada!\n");
}

Editado por CPP
Link para o comentário
Compartilhar em outros sites

  • 0
Olá Fabin,

No seu for o uso de x[posicao].nome = ' ' está incorreto, o mesmo vale pra .telefone = ' '.

Isso porque um array de bytes pra ser usado assim precisa ser indexado, ou seja, você teria que ter outra variavel pra fazer:

for (int a = 0; a < 20; a++)
   x[posicao].nome[a] = ' ';
for (int b = 0; b < 14; b++)
   x[posicao].telefone[b] = ' ';
Mas isso não é muito pratico, então você pode usar o strcpy() pra zerar suas variaveis do tipo array de bytes.
strcpy(x[posicao].nome, "");
   strcpy(x[posicao].telefone, "");
Também pode usar o memset() pra preencher um conteudo de memória. Eu coloquei as duas opções no seu código. qualquer dúvida fala ai. Abs
#include <stdlib.h>
#include <stdio.h>
#include <mem.h>
#include <string.h>

typedef struct
{
        char nome[20];
        char telefone[14];
}contato;

void limpar_agenda(contato x[10]);
void limpar_agenda2(contato *x, int items);

int main()
{
    contato agenda[10];
    
    limpar_agenda(agenda);
    limpar_agenda2(&agenda[0], 10);
    system("pause");
    return 0;
}

void limpar_agenda(contato x[10])
{
     for(int posicao=0;posicao<10;posicao++)
     {
             strcpy(x[posicao].nome, "");
             strcpy(x[posicao].telefone, "");
     }
     
     printf("\nAgenda Apagada!\n");
}

void limpar_agenda2(contato *x, int items)
{
    memset(x, 0, sizeof(contato) * items);
    printf("\nAgenda Apagada!\n");
}

O primeiro Metodo acho que entendi, me corrija se estiver errado, no casos ele vai copiar vazio para cada posição em nome e telefone da agenda certo, agora o outro metodo você está usando ponteiro sei pouca coisa e tambem o professor vai dar essa materia hoje então não vou usa-la por enquanto

mas qualquer duvida posto aqui novamente

valews

t+

Editado por Fabin
Link para o comentário
Compartilhar em outros sites

  • 0

Só pra você entender o que acontece na memoria eu fiz mais algumas modificações.

Copio a string "abcdefghijklmnopqrst" para agenda[0].nome.

Ai você pode ver que na primeira posição tem [a = 97] e na ultima tem [ = 0].

Aqui [ = 0] representa o final da string.

Quando você faz o strcpy(<variavel>, "") ele coloca o "\ 0" na primeira posição indicando que ela termina ali e ignora o resto da memória.

Quando uso o memset() passando a quantidade de bytes que eu quero preencher ele limpa toda a memória.

A primeira opção atende sua necessidade atual, só estou acrescentando elementos pra você poder manipular a memória do jeito que precisar.

Desculpa se as vezes eu complico as coisas.

Abs

Executa o programa abaixo pra ver as saidas.

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

typedef struct
{
        char nome[20];
        char telefone[14];
}contato;

void limpar_agenda(contato x[10]);
void limpar_agenda2(contato *x, int items);

int main()
{
    contato agenda[10];
    
    strcpy(agenda[0].nome, "abcdefghijklmnopqrst");
    int s;
    printf("\n\nString = %s\n\n", agenda[0].nome);
    for (s = 0; s <= 20; s++)
        printf("[%c = %3d] ", agenda[0].nome[s], agenda[0].nome[s]);
    printf("\n\n");

    limpar_agenda(agenda);
    for (s = 0; s <= 20; s++)
        printf("[%c = %3d] ", agenda[0].nome[s], agenda[0].nome[s]);
    printf("\n\n");
    
    limpar_agenda2(&agenda[0], 10);
    for (s = 0; s <= 20; s++)
        printf("[%c = %3d] ", agenda[0].nome[s], agenda[0].nome[s]);
    printf("\n\n");
    system("pause");
    return 0;
}

void limpar_agenda(contato x[10])
{
     for(int posicao=0;posicao<10;posicao++)
     {
             strcpy(x[posicao].nome, "");
             strcpy(x[posicao].telefone, "");
     }
     
     printf("\nAgenda Apagada!\n");
}

void limpar_agenda2(contato *x, int items)
{
    memset(x, 0, sizeof(contato) * items);
    printf("\nAgenda Apagada!\n");
}

Link para o comentário
Compartilhar em outros sites

  • 0
Só pra você entender o que acontece na memoria eu fiz mais algumas modificações.

Copio a string "abcdefghijklmnopqrst" para agenda[0].nome.

Ai você pode ver que na primeira posição tem [a = 97] e na ultima tem [ = 0].

Aqui [ = 0] representa o final da string.

Quando você faz o strcpy(<variavel>, "") ele coloca o "\ 0" na primeira posição indicando que ela termina ali e ignora o resto da memória.

Quando uso o memset() passando a quantidade de bytes que eu quero preencher ele limpa toda a memória.

A primeira opção atende sua necessidade atual, só estou acrescentando elementos pra você poder manipular a memória do jeito que precisar.

Desculpa se as vezes eu complico as coisas.

Abs

Executa o programa abaixo pra ver as saidas.

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

typedef struct
{
        char nome[20];
        char telefone[14];
}contato;

void limpar_agenda(contato x[10]);
void limpar_agenda2(contato *x, int items);

int main()
{
    contato agenda[10];
    
    strcpy(agenda[0].nome, "abcdefghijklmnopqrst");
    int s;
    printf("\n\nString = %s\n\n", agenda[0].nome);
    for (s = 0; s <= 20; s++)
        printf("[%c = %3d] ", agenda[0].nome[s], agenda[0].nome[s]);
    printf("\n\n");

    limpar_agenda(agenda);
    for (s = 0; s <= 20; s++)
        printf("[%c = %3d] ", agenda[0].nome[s], agenda[0].nome[s]);
    printf("\n\n");
    
    limpar_agenda2(&agenda[0], 10);
    for (s = 0; s <= 20; s++)
        printf("[%c = %3d] ", agenda[0].nome[s], agenda[0].nome[s]);
    printf("\n\n");
    system("pause");
    return 0;
}

void limpar_agenda(contato x[10])
{
     for(int posicao=0;posicao<10;posicao++)
     {
             strcpy(x[posicao].nome, "");
             strcpy(x[posicao].telefone, "");
     }
     
     printf("\nAgenda Apagada!\n");
}

void limpar_agenda2(contato *x, int items)
{
    memset(x, 0, sizeof(contato) * items);
    printf("\nAgenda Apagada!\n");
}
não ta complicando não, afinal vou ver essa materia hoje de ponteiros ai é bom que tento entender mais tarde a 2 opção que me passou, a primeira eu entendi melhor agora com a explicação agora outra duvida estou fazendo uma função para pesquisar, porem quando a posição está vazia ('') ele está passando direto pelo if e executando o else, o que pode ser
void pesquisar_agenda(contato x[10])
{
     int posicao;
     system("cls");
     printf("***Pesquisar Contato***\n\n");
     do{
             printf("Digite uma posição de 1 a 10:\t");
             scanf("%d",&posicao);
     }while(posicao < 1 || posicao > 10);
     posicao--;
     if(x[posicao].nome == '')
     {
           printf("Não há contato nesta posição!\n");
           system("pause");
     }
     else
     {
         printf("Nome: \t%s.\n",x[posicao].nome);
         printf("Telefone: \t%s.\n",x[posicao].telefone);
     }
}

Editado por Fabin
Link para o comentário
Compartilhar em outros sites

  • 0

Isso tem a ver com o que eu mencionei antes.

Um array de bytes precisa ser indexado ou usar funções que o tratem corretamente.

Tenta uma das opções no if:

if(x[posicao].nome[0] == ' ')

ou

if (strcmp(x[posicao].nomte, "") == 0)

ou

if (strlen(x[posicao].nome) == 0)

Abs

Link para o comentário
Compartilhar em outros sites

  • 0
Isso tem a ver com o que eu mencionei antes.

Um array de bytes precisa ser indexado ou usar funções que o tratem corretamente.

Tenta uma das opções no if:

if(x[posicao].nome[0] == ' ')

ou

if (strcmp(x[posicao].nomte, "") == 0)

ou

if (strlen(x[posicao].nome) == 0)

Abs

entendo CPP, foi mal pelo vacilo

vou ir fazendo o restante aqui...

te mandei uma mensagem depois da uma lolhada la

abraço

t+

Link para o comentário
Compartilhar em outros sites

  • 0
Que isso mano.

De boa, só espero estar ajudando em alguma coisa.

Abs

brother tu deve dar aula melhor que meu professor rsrs.. to aprendendo muito

desenvolvio programa verifica se ficou legal e que posso melhorar

/*1. Melhore o programa de agenda criado nas aulas de revisão através da utilização de estruturas.*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//-------------------------------------------------
// Declaração das Estruturas Usadas no Programa
//-------------------------------------------------
typedef struct
{
        char nome[20];
        char telefone[14];
}contato;
//-------------------------------------------------
// Declarações das Funções usadas no Programa
//-------------------------------------------------
void limpar_agenda(contato x[10]);
void pesquisar_agenda(contato x[10]);
void inserir(contato x[10]);
void alterar(contato x[10]);
void excluir(contato x[10]);
int menu(void);

//--------------------------------------------------------

int main() //Função Principal do Para execução do Programa
{
    contato agenda[10];
    int opcao;
    
    limpar_agenda(agenda);
    do{
           opcao = menu();
           switch(opcao) {
                         case 1: pesquisar_agenda(agenda);
                         break;
                         case 2: inserir(agenda);
                         break;
                         case 3: alterar(agenda);
                         break;
                         case 4: excluir(agenda);
                         break;
                         case 9: limpar_agenda(agenda);
                         break;
                         case 0: // sai do programa
                         break;
                         default: printf("\nOPCAO INVALIDA! \n");
                         system("pause");
                         break;
           }
    }while(opcao!= 0);
    system("pause");
    return 0;
}
//-------------------------------------------------------------------------------------------
// Declaração dos Escopos das funções
//-------------------------------------------------------------------------------------------
int menu(void) //função para mostrar menu na tela e returna opção escolhida
{
    int op;
    system("cls");
    printf("***Menu de Opcoes***\n");
    printf("1 - Pesquisar Contatos \n");
    printf("2 - Inserir Contatos \n");
    printf("3 - Alterar Contatos \n");
    printf("4 - Excluir Contatos \n");
    printf("9 - Limpar Agenda \n");
    printf("0 - Sair \n");
    printf("\n\t Digite uma Opcao: \n");
    scanf("%d",&op);
    return op;
}

//--------------------------------------------------------------------------------------------

void limpar_agenda(contato x[10])//função para limpar agenda
{

     for(int posicao=0;posicao<10;posicao++)
     {
             strcpy(x[posicao].nome, "");//copia vazio para nome e telefone para cada posição da agenda
             strcpy(x[posicao].telefone, "");
     }
     printf("Agenda Apagada!\n");
}

//----------------------------------------------------------------------------------------------

void pesquisar_agenda(contato x[10]) //função para pesquisar contato na agenda
{
     int posicao;
     system("cls");
     printf("***Pesquisar Contato***\n\n");
     do{
             printf("Digite uma posição de 1 a 10:\t"); //do para garantir que usuário irá digitar posição de 1 a 10
             scanf("%d",&posicao);
     }while(posicao < 1 || posicao > 10);
     posicao--; //diminui uma posição poi vetor começa do 0 e termina no 9
     if(strcmp(x[posicao].nome,"") == 0) //compara posição se estiver vazia entra neste if
     {
           printf("não há contato nesta posicao!\n");
           system("pause");
     }
     else // senão imprime na tela posição com contato solicitado pelo usuário
     {
         printf("Nome: \t%s.\n",x[posicao].nome);
         printf("Telefone: \t%s.\n",x[posicao].telefone);
         system("pause");
     }
}

//--------------------------------------------------------------------------------------------------

void inserir(contato x[10]) //função para inserir contato na agenda
{
     int posicao = 0;
     while((strcmp(x[posicao].nome,"") == 0) && posicao < 9) //aqui incrementa na posição enquanto estiver vazia e for menor que 9
     {
            posicao++;
     }
     if(posicao < 10 && ((strcmp(x[posicao].nome,"")==0))) //se posição menor que 10 e estiver vazia ira inserir
     {
                printf("Digite o Nome:\t\n");
                getchar();
                gets(x[posicao].nome);
                printf("Digite o Telefone: \t\n");
                getchar();
                gets(x[posicao].telefone);
     }
     else //senão retorna que agenda está cheia
     {
         printf("Agenda Cheia!\n");
         system("pause");
     }
}

//---------------------------------------------------------------------------------------------------

void alterar(contato x[10]) //função para alterar contato
{
     int posicao;
     char confirma;
     do{
          printf("Informe uma posição de 1 a 10 para alterar:\t\n"); 
          scanf("%d",&posicao);
     }while(posicao < 1 || posicao > 10); //do para garantir que usuário irá digitar posição de 1 a 10
     posicao--;
     if(strcmp(x[posicao].nome,"")== 0) //se posição estiver vazia retorna que não há contato na posição
     {
         printf("Sem contato nessa posicao.\n");
         system("pause");
     }
     else
     {
         printf("Nome:\t%s\n",x[posicao].nome); //senão entra no else para verificar se usuário deseja alterar nome e telefone
         printf("Deseja alterar o nome? (s)im / (n)ao\n");
         getchar();
         scanf("%c",&confirma);
         if(confirma == 's')
         {
                printf("Digite o Nome:\t");
                getchar();
                gets(x[posicao].nome);
                printf("Nome alterado com Sucesso!.\n");
         }
         printf("Telefone:\t%s\n",x[posicao].telefone);
         printf("Deseja alterar o telefone? (s)im / (n)ao\n");
         getchar();
         scanf("%c",&confirma);
         if(confirma == 's')
         {
                   printf("Digite o telefone:\t");
                   getchar();
                   gets(x[posicao].telefone);
                   printf("Telefone alterado com sucesso!\n");
                   system("pause");
         }
     }
}

//------------------------------------------------------------------------------------------------------------------

void excluir(contato x[10])// função para excluir contato
{
     int posicao;
     char confirma;
     do{
          printf("Informe uma posição de 1 a 10 para excluir:\t\n");
          scanf("%d",&posicao); //do para garantir que usuário irá digitar posição de 1 a 10
     }while(posicao < 1 || posicao > 10);
     posicao--;
     if(strcmp(x[posicao].nome,"")== 0) //se posição estiver vazia retorna que não há contato na posição para excluir
     {
         printf("Sem contato nessa posicao.\n");
         system("pause");
     }
     else
     {
         printf("Nome:\t%s\n",x[posicao].nome); //senão entra no else para verificar se usuário deseja excluir nome e telefone
         printf("Deseja excluir o nome? (s)im / (n)ao\n");
         getchar();
         scanf("%c",&confirma);
         if(confirma == 's')
         {
                strcpy(x[posicao].nome, "");
                printf("Nome excluido com Sucesso!.\n");
         }
         printf("Telefone:\t%s\n",x[posicao].telefone);
         printf("Deseja excluir o telefone? (s)im / (n)ao\n");
         getchar();
         scanf("%c",&confirma);
         if(confirma == 's')
         {
                   strcpy(x[posicao].telefone, "");
                   printf("Telefone excluido com sucesso!\n");
                   system("pause");
         }
     }
}                                       
//--------------------------------------------------------------------------------------------------------------------

valews brother

abraço

t+

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...