Fabin Postado Março 22, 2011 Denunciar Share Postado Março 22, 2011 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 CPP Postado Março 22, 2011 Denunciar Share Postado Março 22, 2011 (editado) 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 Março 22, 2011 por CPP Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fabin Postado Março 22, 2011 Autor Denunciar Share Postado Março 22, 2011 (editado) 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 enquantomas qualquer duvida posto aqui novamentevalewst+ Editado Março 22, 2011 por Fabin Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 CPP Postado Março 22, 2011 Denunciar Share Postado Março 22, 2011 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.AbsExecuta 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"); } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fabin Postado Março 22, 2011 Autor Denunciar Share Postado Março 22, 2011 (editado) 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.AbsExecuta 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 Março 22, 2011 por Fabin Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 CPP Postado Março 22, 2011 Denunciar Share Postado Março 22, 2011 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] == ' ')ouif (strcmp(x[posicao].nomte, "") == 0)ouif (strlen(x[posicao].nome) == 0)Abs Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fabin Postado Março 22, 2011 Autor Denunciar Share Postado Março 22, 2011 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] == ' ')ouif (strcmp(x[posicao].nomte, "") == 0)ouif (strlen(x[posicao].nome) == 0)Absentendo CPP, foi mal pelo vacilovou ir fazendo o restante aqui...te mandei uma mensagem depois da uma lolhada laabraçot+ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 CPP Postado Março 22, 2011 Denunciar Share Postado Março 22, 2011 Que isso mano.De boa, só espero estar ajudando em alguma coisa.Abs Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fabin Postado Março 22, 2011 Autor Denunciar Share Postado Março 22, 2011 Que isso mano.De boa, só espero estar ajudando em alguma coisa.Absbrother tu deve dar aula melhor que meu professor rsrs.. to aprendendo muitodesenvolvio 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 brotherabraçot+ Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Fabin
Bom dia pessoal!
O meu problema é banal porem não sei como resolver, sempre que compilo o programa ocorre o erro:
estou fazendo aos poucos meu codigo, estou fazendo as funçoes e testando. ta ai o codigovlaews pela ajuda
Link para o comentário
Compartilhar em outros sites
8 respostass a esta questão
Posts Recomendados
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.