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

Problema com recebimento e listagem de strings em C


denin

Pergunta

olá galera,

sou novato na linguagem C e estou com dois problemas pra criar um programa

tenho que fazer uma lista para cadastrar nome e telefone de usuarios, e criar rotinas para cadastro de usuario, remoção de usuario, listagem e busca por usuario.

o primeiro problema está quando solicito ao usuario o nome e telefone a ser cadastrado, atraves desse codigo

case 1:   
         if (cheia(list)) printf("ERRO! Lista cheia. Impossivel inserir."); 
         else {
           char sujeito[50];
           char fone[15];
           
           printf("\nDigite o nome a ser cadastrado: ");
           gets (sujeito);
            printf("\n");
           
           printf("\nDigite o telefone: ");
            gets (fone);
           printf("\n");
           
           Cadastro(&list, *sujeito, *fone);
           printf("Insercao realizada com sucesso!\n");
         }
        break;
rotina de cadastro que é chamada:
void Cadastro(Tlista*lista, char sujeito, char fone)
{
     int p;
     p = lista->dispo; //dispo é a posição disponivel
     lista->dispo = lista->l[lista->dispo].prox; // prox é o proxima posição
     lista->l[p].prox = lista->prim; // prim é a posição q inicia a lista
     lista->prim = p;
     strcpy(lista->l[p].nome, &sujeito); // copiando o nome q usuario digitou para a lista
     strcpy(lista->l[p].tel, &fone);  //copiando o telefone que o usuario digitou para a lista
     
 }
porem ao executar, na tela aparece: Digite o nome a ser cadastrado: Digite o telefone: *o problema é que o cursor para apos a palavra telefone, ignorando o cadastro do nome e pulando para linha de baixo esperando o usuario cadastrar o telefone, o que pode ser isso? _____________ o segundo problema esta na listagem, quando o usuario escolhe a opçao de listagem. o programa deveria apresentar o nome e telefone de todos os usuarios cadastrados, porém o programa apenas apresenta o primeiro caracter do telefone, a rotina de listagem do codigo é a seguinte:
void imprimeLista(Tlista lista)//ARRUMAR OS 20 DE CADA VEZ
//Rotina para impressao da lista na tela
//Parametro de entrada: a lista a ser impressa
//Parametro de saida: inexistente
//Retorno: inexistente - funcao void
{
  int p; //Variavel auxiliar que percorre a lista para imprimir as informacoes
  int cont = 0;
  p = lista.prim;        //A partir do primeiro elemento...
  while ((p != -1){      //Enquanto não encontra o final da lista...
    printf("%s", lista.l[p].nome);//Imprime nome e telefone
    printf("%s", lista.l[p].tel);    
    p = lista.l[p].prox;    //Salta para o proximo no
  } //Fim do while(p != -1)
}

Por exemplo se o usuario digita o telefone 123456,

na hora de apresentar o telefone na tela, o programa apresenta apenas o primeiro caracter da string ou seja, apresenta o numero '1',

galera, sou muito leigo ainda em C,

então por favor se puderem paciencia comigo, e ficarei muito grato com qualquer ajuda

agradeço desde já

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Bom dia,

Tenta fazer as alterações abaixo:

case 1: 
if (cheia(list)) printf("ERRO! Lista cheia. Impossivel inserir."); 
else {
char sujeito[50];
char fone[15];

printf("\nDigite o nome a ser cadastrado: ");
fflush(stdin); // <------------- limpa o buffer de entrada
gets (sujeito);
printf("\n");

printf("\nDigite o telefone: ");
fflush(stdin); // <------------- limpa o buffer de entrada
gets (fone);
printf("\n");

Cadastro(&list, *sujeito, *fone);
printf("Insercao realizada com sucesso!\n");
}
break;

rotina de cadastro que é chamada:

void Cadastro(Tlista*lista, char *sujeito, char *fone) // < --- os parametros sujeito e fone tem que ponteiros para array de bytes e não UM byte
{
int p;
p = lista->dispo; //dispo é a posição disponivel
lista->dispo = lista->l[lista->dispo].prox; // prox é o proxima posição
lista->l[p].prox = lista->prim; // prim é a posição q inicia a lista
lista->prim = p;
strcpy(lista->l[p].nome, sujeito); // copiando o nome q usuario digitou para a lista <--- remover o operador &
strcpy(lista->l[p].tel, fone); //copiando o telefone que o usuario digitou para a lista <--- remover o operador &
}

No mais, sem o codigo completo só posso desejar bom trabalho.

Abs

Link para o comentário
Compartilhar em outros sites

  • 0
Bom dia,

Tenta fazer as alterações abaixo:

case 1: 
if (cheia(list)) printf("ERRO! Lista cheia. Impossivel inserir."); 
else {
char sujeito[50];
char fone[15];

printf("\nDigite o nome a ser cadastrado: ");
fflush(stdin); // <------------- limpa o buffer de entrada
gets (sujeito);
printf("\n");

printf("\nDigite o telefone: ");
fflush(stdin); // <------------- limpa o buffer de entrada
gets (fone);
printf("\n");

Cadastro(&list, *sujeito, *fone);
printf("Insercao realizada com sucesso!\n");
}
break;

rotina de cadastro que é chamada:

void Cadastro(Tlista*lista, char *sujeito, char *fone) // < --- os parametros sujeito e fone tem que ponteiros para array de bytes e não UM byte
{
int p;
p = lista->dispo; //dispo é a posição disponivel
lista->dispo = lista->l[lista->dispo].prox; // prox é o proxima posição
lista->l[p].prox = lista->prim; // prim é a posição q inicia a lista
lista->prim = p;
strcpy(lista->l[p].nome, sujeito); // copiando o nome q usuario digitou para a lista <--- remover o operador &
strcpy(lista->l[p].tel, fone); //copiando o telefone que o usuario digitou para a lista <--- remover o operador &
}

No mais, sem o codigo completo só posso desejar bom trabalho.

Abs

o primeiro problema relacionado ao foto do cursor estar ignorando o cadastro do nome foi resolvido com o codigo que você me falou, mt obrigado

porém o 2° problema na hora de listar o nome e telefone do usuario ainda continua

conforme você disse, eu tentei tirar o operando '&', porem na hora de compilar o compilador acusa o seguinte erro:

C:\Documents and Settings\Denis Andrade\Meus documentos\testes\começo.c In function `Cadastro':

67 C:\Documents and Settings\Denis Andrade\Meus documentos\testes\começo.c [Warning] passing arg 2 of `strcpy' makes pointer from integer without a cast

67 C:\Documents and Settings\Denis Andrade\Meus documentos\testes\começo.c [Warning] passing arg 2 of `strcpy' makes pointer from integer without a cast

fazendo novamente outro teste

ao cadastrar nome: junior

telefone : 123

na hora de listar o programa esta apresentando na tela: j1j (mt estranho)

segue todo o codigo

é o programa que tenho que fazer sobre listas estatica

ainda tenho que implementar outras rotinas, porem estou tendo problemas na rotina de listagem, e quero resolver esse problema primeiro pra depois partir para proximas rotinas

//Programa exemplo de implementacao de Lista Encadeada Estatica

//Autor: Prof. Alessandro de Castro Borges

//Data: fevereiro de 2011

#include <stdio.h> //Bibliotecas

#include <stdlib.h>

//ESTRUTURAS

typedef struct { //Definindo a estrutura do no

char nome[50];

char tel[15]; //O campo onde será armazenada a informação do no

int prox; //O apontador para o próximo no da lista

} Tno; //O nome do tipo associado ao no - Tno

typedef struct { //Definindo a estrutura da lista, com vetor, prim e dispo

Tno l[100]; //Vetor de nos

int prim; //Apontador para o primeiro elemento da lista

int dispo; //Apontador para o primeiro no disponivel para insercao

} Tlista; //Nome do tipo associado aa lista - Tlista

Tlista list; //Declaração da lista a ser usada no programa

int i; //Variável para uso como indice

char c; //Variavel auxiliar para aguardar o pressionar do <ENTER>

//ROTINAS

void iniciaLista(Tlista *lista)

{

for(i=0; i<99; i++) {lista->l.prox = i+1;} //cada no aponta seu proximo

lista->l[9].prox = -1; //Ultimo no aponta como proximo o final da lista

lista->prim = -1; //Primeiro elemento aponta vazio (lista vazia)

lista->dispo = 0; //Primeiro disponivel aponta primeiro no do vetor

}

int cheia(Tlista lista)

//Rotina que verifica se uma lista esta cheia

//Parametro de entrada: a lista a ser verificada

//Parametro de saida: inexistente

//Retorno: retorna 1 se estiver cheia, e 0 caso contrario

{

if(lista.dispo == -1) return(1); //Se a lista esta cheia, não há no disponivel

else return(0);

}

int vazia(Tlista lista)

//Rotina que verifica se uma lista esta vazia

//Parametro de entrada: a lista a ser verificada

//Parametro de saida: inexistente

//Retorno: retorna 1 se estiver vazia, e 0 caso contrario

{

if(lista.prim == -1) return(1); //Uma lista vazia não possui primeiro elemento

else return(0);

}

void Cadastro(Tlista*lista, char sujeito, char fone)

{

int p;

p = lista->dispo;

lista->dispo = lista->l[lista->dispo].prox;

lista->l[p].prox = lista->prim;

lista->prim = p;

strcpy(lista->l[p].nome, &sujeito);

strcpy(lista->l[p].tel, &fone);

}

void imprimeLista(Tlista lista)

//Rotina para impressao da lista na tela

//Parametro de entrada: a lista a ser impressa

//Parametro de saida: inexistente

//Retorno: inexistente - funcao void

{

int p; //Variavel auxiliar que percorre a lista para imprimir as informacoes

p = lista.prim; //A partir do primeiro elemento...

while (p != -1) { //Enquanto não encontra o final da lista...

printf("%s", lista.l[p].nome);//Imprime cada elemento, e

printf("%s", lista.l[p].tel);

p = lista.l[p].prox; //Salta para o proximo no

} //Fim do while(p != -1)

}

int menu(void)

//Rotina para apresentacao do menu e leitura da opcao do usuario

//Parametro de entrada: inexistente

//Parametro de saida: inexistente

//Retorno: o numero da opcao escolhida pelo usuario

{

int opcao;

do {

system("cls"); //Limpa a tela - biblioteca <stdlib.h>

printf("Listas Encadeadas Implementadas Estaticamente\n"); //Titulo do menu

printf("Programa de Testes e Aprendizado\n\n");

printf("MENU\n\n");

printf(" 1 - Cadastrar participante\n");

printf(" 3 - Listar todos os participantes\n");

printf(" 7 - Sair\n");

printf("\n\nOpcao: ");

scanf("%d", &opcao);

if((opcao<1)||(opcao>7)) { //Caso o usuario digite uma opcao invalida

printf("\n\nOpcao '%d' invalida! Escolha entre <1> e <11>.\n", opcao);

printf("\nTecle <ENTER> para continuar e tentar novamente...");

c = getche();

}

} while((opcao<1)||(opcao>7)); //Repete ate ler uma opcao valida

return(opcao);

}

main (void) //Programa Principal

{

int op; //Variavel para receber a opcao do menu

iniciaLista(&list); //Inicialização da lista com todos os nos disponiveis

do {

op = menu(); //Chamada da rotina do menu

switch(op){

case 1: //Opcao de insercao de um elemento no inicio da lista

if (cheia(list)) printf("ERRO! Lista cheia. Impossivel inserir.");

else {

char sujeito[50];

char fone[15];

printf("\nDigite o nome a ser cadastrado: ");

fflush(stdin); // <------------- limpa o buffer de entrada

gets (sujeito);

printf("\n");

printf("\nDigite o telefone: ");

fflush(stdin); // <------------- limpa o buffer de entrada

gets (fone);

printf("\n");

Cadastro(&list, *sujeito, *fone);

printf("Insercao realizada com sucesso!\n");

}

break;

case 3://IMPRIME

if (vazia(list)) printf("\nLista vazia! não há elementos para imprimir.\n");

else {

imprimeLista(list);

printf("\n\nImpressao concluida!\n");

}

break;

case 7: //Opcao de saida do programa

printf("\nATENCAO! Tem certeza de que deseja sair do programa?\n");

printf("Para confirmar, tecle (S) ou (s): ");

c = getche(); //Pedido de confirmacao

if((c == 's') || (c == 'S')) {

iniciaLista(&list); //Se confirmado, o programa é encerrado

printf("\n\nFIM DE PROGRAMA.\n");

}

else {

printf("\n\nOperacao não confirmada - acao cancelada\n");

op++; //Alteracao do valor da opcao para diferenciar de 7 (saida)

}

break;

} //Fim do switch(op)

printf("\npressione <ENTER> para continuar...");

c = getche();

printf("\n");

} while(op != 7); //Repete o processo ate ser escolhida a opcao de saida - 9

printf("Tecle <ENTER> para encerrar\n");

c = getche();

} //Fim do programa.

Link para o comentário
Compartilhar em outros sites

  • 0

Opa, no outro post eu tinha marcado a função:

void Cadastro(Tlista*lista, char *sujeito, char *fone) // < --- os parametros sujeito e fone tem que ponteiros para array de bytes e não UM byte

Nela você deveria acrescentar o * nas variaveis sujeito e fone.

Ficou faltando essa alteração no seu código.

Mas olhando com mais detalhe você tambem tá fazendo uma coisa errada.

Quando chama a função Cadastro(&list, *sujeito, *fone); com o * no sujeito e fone você tá passando apenas o primeiro byte do array e não o ponteiro pra ele.

Segue seu código corrigido e funcionando.

Qualquer dúvida é só falar.

Abs


//Programa exemplo de implementacao de Lista Encadeada Estatica
//Autor: Prof. Alessandro de Castro Borges
//Data: fevereiro de 2011

#include <stdio.h> //Bibliotecas
#include <stdlib.h>
#include <string.h>
#include <conio.h>

//ESTRUTURAS

typedef struct
{ //Definindo a estrutura do no
char nome[50];
char tel[15]; //O campo onde será armazenada a informação do no
int prox; //O apontador para o próximo no da lista
} Tno; //O nome do tipo associado ao no - Tno

typedef struct
{ //Definindo a estrutura da lista, com vetor, prim e dispo
Tno l[100]; //Vetor de nos
int prim; //Apontador para o primeiro elemento da lista
int dispo; //Apontador para o primeiro no disponivel para insercao
} Tlista; //Nome do tipo associado aa lista - Tlista

Tlista list; //Declaração da lista a ser usada no programa
int i; //Variável para uso como indice
char c; //Variavel auxiliar para aguardar o pressionar do <ENTER>

//ROTINAS

void iniciaLista(Tlista *lista)
{
for(i=0; i<99; i++)
{
lista->l[i].prox = i+1;
} //cada no aponta seu proximo
lista->l[9].prox = -1; //Ultimo no aponta como proximo o final da lista
lista->prim = -1; //Primeiro elemento aponta vazio (lista vazia)
lista->dispo = 0; //Primeiro disponivel aponta primeiro no do vetor
}

int cheia(Tlista lista)
//Rotina que verifica se uma lista esta cheia
//Parametro de entrada: a lista a ser verificada
//Parametro de saida: inexistente
//Retorno: retorna 1 se estiver cheia, e 0 caso contrario
{
if(lista.dispo == -1)
return(1); //Se a lista esta cheia, não há no disponivel
else
return(0);
}

int vazia(Tlista lista)
//Rotina que verifica se uma lista esta vazia
//Parametro de entrada: a lista a ser verificada
//Parametro de saida: inexistente
//Retorno: retorna 1 se estiver vazia, e 0 caso contrario
{
if(lista.prim == -1)
return(1); //Uma lista vazia não possui primeiro elemento
else
return(0);
}

void Cadastro(Tlista*lista, char *sujeito, char *fone)
{
int p;
p = lista->dispo;
lista->dispo = lista->l[lista->dispo].prox;
lista->l[p].prox = lista->prim;
lista->prim = p;
strcpy(lista->l[p].nome, sujeito);
strcpy(lista->l[p].tel, fone);
}

void imprimeLista(Tlista lista)
//Rotina para impressao da lista na tela
//Parametro de entrada: a lista a ser impressa
//Parametro de saida: inexistente
//Retorno: inexistente - funcao void
{
int p; //Variavel auxiliar que percorre a lista para imprimir as informacoes

p = lista.prim; //A partir do primeiro elemento...
while (p != -1)
{ //Enquanto não encontra o final da lista...
printf("%s\n", lista.l[p].nome);//Imprime cada elemento, e
printf("%s\n", lista.l[p].tel);
p = lista.l[p].prox; //Salta para o proximo no
} //Fim do while(p != -1)
}

int menu(void)
//Rotina para apresentacao do menu e leitura da opcao do usuario
//Parametro de entrada: inexistente
//Parametro de saida: inexistente
//Retorno: o numero da opcao escolhida pelo usuario
{
int opcao;

do
{
system("cls"); //Limpa a tela - biblioteca <stdlib.h>
printf("Listas Encadeadas Implementadas Estaticamente\n"); //Titulo do menu
printf("Programa de Testes e Aprendizado\n\n");
printf("MENU\n\n");
printf(" 1 - Cadastrar participante\n");
printf(" 3 - Listar todos os participantes\n");
printf(" 7 - Sair\n");
printf("\n\nOpcao: ");
scanf("%d", &opcao);
if((opcao<1)||(opcao>7))
{ //Caso o usuario digite uma opcao invalida
printf("\n\nOpcao '%d' invalida! Escolha entre <1> e <11>.\n", opcao);
printf("\nTecle <ENTER> para continuar e tentar novamente...");
c = getche();
}
} while((opcao<1)||(opcao>7)); //Repete ate ler uma opcao valida
return(opcao);
}

main (void) //Programa Principal
{
int op; //Variavel para receber a opcao do menu

iniciaLista(&list); //Inicialização da lista com todos os nos disponiveis

do
{
op = menu(); //Chamada da rotina do menu

switch(op)
{
case 1: //Opcao de insercao de um elemento no inicio da lista
if (cheia(list))
printf("ERRO! Lista cheia. Impossivel inserir.");
else
{
char sujeito[50];
char fone[15];

printf("\nDigite o nome a ser cadastrado: ");
fflush(stdin); // <------------- limpa o buffer de entrada
gets (sujeito);
printf("\n");

printf("\nDigite o telefone: ");
fflush(stdin); // <------------- limpa o buffer de entrada
gets (fone);
printf("\n");

Cadastro(&list, sujeito, fone);
printf("Insercao realizada com sucesso!\n");
}
break;
case 3://IMPRIME
if (vazia(list))
printf("\nLista vazia! não há elementos para imprimir.\n");
else
{
imprimeLista(list);
printf("\n\nImpressao concluida!\n");
}
break;
case 7: //Opcao de saida do programa
printf("\nATENCAO! Tem certeza de que deseja sair do programa?\n");
printf("Para confirmar, tecle (S) ou (s): ");
c = getche(); //Pedido de confirmacao
if((c == 's') || (c == 'S'))
{
iniciaLista(&list); //Se confirmado, o programa é encerrado
printf("\n\nFIM DE PROGRAMA.\n");
}
else
{
printf("\n\nOperacao não confirmada - acao cancelada\n");
op++; //Alteracao do valor da opcao para diferenciar de 7 (saida)
}
break;
} //Fim do switch(op)
printf("\npressione <ENTER> para continuar...");
c = getche();
printf("\n");
} while(op != 7); //Repete o processo ate ser escolhida a opcao de saida - 9
printf("Tecle <ENTER> para encerrar\n");
c = getche();
return 0;
} //Fim do programa.

[/codebox]

Link para o comentário
Compartilhar em outros sites

  • 0

cara muito obrigado, você me ajudou muito

realmente eu estou me enrolando muito nesses parametros '&' '*'

não to sabendo muito bem usar, mas vou dar uma estudada nisso,

vou terminar as outras rotinas qualquer coisa eu te peço outras ajudas se for possivel

vlw fera

abrass

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,3k
×
×
  • Criar Novo...