Ir ao conteúdo

C Erro ao ler inteiro com scanf.


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

Olá, eu tentando criar um cadastro de funcionários usando struct em c, me deparei com o seguinte problema:

Quando tentava ler e logo após imprimir o número do DDD do usuário. O programa ao invés de imprimir o valor da variável DDD imprimia o local da variável...

"Consegui resolver o problema"  colocando %s no scanf ao invés de %d (que seria o adequado já que minha variável é de tipo inteiro)... 

Porque isso aconteceu??? 

Segue o código abaixo:

 

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

struct cadastro
{
///DADOS PESSOAIS:
    char nome[50],
         email[50];

    int ddd[10];
    int numero_tel[20];
};


int main()
{
    setlocale(LC_ALL, "");

    struct cadastro funcionario[100];
    int cont = 0,
        escolha = 1;

    do{

    printf("-------------------------\n"
           "CADASTRO DE FUNCIONÁRIO:\n"
           "-------------------------\n"
           "(1) FAZER UM NOVO CADASTRO\n"
           scanf("%d", &escolha);
           fflush(stdin);
           system("cls");

    switch(escolha)
    {
    case 1:

        for(cont; cont<=100; cont++){

        printf("INFORME NOME DO FUNCIONÁRIO: ");
        fgets(funcionario[cont].nome, 50, stdin);
        funcionario[cont].nome[strlen(funcionario[cont].nome)-1] = '\0';
        fflush(stdin);
        printf("INFORME E-MAIL DE FUNCIONÁRIO: ");
        fgets(funcionario[cont].email, 50, stdin);
        funcionario[cont].email[strlen(funcionario[cont].email)] = '\0';
        fflush(stdin);
        printf("INFORME SEU DDD: ");
        scanf("%s", &funcionario[cont].ddd);
        fflush(stdin);
        break;
        }
        system("cls");
        printf("\tUSUÁRIO: %s\n"
               "\tCADASTRADO COM SUCESSO\n"
               "\tPRESSIONE ENTER PARA VOLTAR AO MENU", funcionario[cont].nome);
        getchar();
        system("cls");
        break;


    }
    }while(escolha);

return 0;
}

O programa dessa forma está rodando normalmente... é claro não está completo. alguém poderia me responder e por favor... sem muita complicação, ainda sou iniciante rsrs...

  • Curtir 1
Postado

@Ananias Winchester Se você for realizar operações matemáticas, use INT para armazenar os números, caso contrário utilize uma string (tipo char)

11 minutos atrás, Ananias Winchester disse:

///DADOS PESSOAIS: char nome[50], email[50]; char ddd[10]; char numero_tel[20]; };

 

  • Solução
Postado

@Ananias Winchester      para fazer mais cadastros você precisa incrementar a variável cont, e esse fgets não é muito bom não pois ele coloca um caractere newline no final da string e isso faz pular uma linha na hora de imprimir, e esse jeito de resetar a string colocando '\0' não costuma funcionar,  melhor usar gets funciona melhor, coloquei o cont e o struct funcionario como global para que eles possam ser acessados em qualquer parte do programa, coloquei um do / while para que o usuário use o programa enquanto quiser e se quiser sair escolhe a opção no menu e sai, e outro do / while na opção de cadastrar para poder fazer quantos cadastros quiser e se não quiser fazer mais nenhum cadastro então sai dessa opção, então seu código com algumas modificações ficaria assim :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
struct cadastro{
    /*///DADOS PESSOAIS:*/
    char nome[50],
         email[50];
    int ddd[10];
    int numero_tel[20];
};
int cont;
struct cadastro funcionario[100];
int main(){
    setlocale(LC_ALL, "");
    int i,escolha = 1;
    char ch;
    do{
        system("cls");
        printf("-------------------------\n"
           "CADASTRO DE FUNCIONÁRIO:\n"
           "-------------------------\n"
           "(1) FAZER UM NOVO CADASTRO\n");
        printf("(2) LISTAR NOMES\n");
        printf("(3) FINALIZAR O PROGRAMA\n       ");
        scanf("%d", &escolha);
        fflush(stdin);
        system("cls");
        switch(escolha){
            case 1:
                do{
                    ch='n';
                    fflush(stdin);
                    printf("INFORME NOME DO FUNCIONÁRIO: ");
                    gets(funcionario[cont].nome);
                    printf("INFORME E-MAIL DE FUNCIONÁRIO: ");
                    fflush(stdin);
                    gets(funcionario[cont].email);
                    printf("INFORME SEU DDD: ");
                    fflush(stdin);
                    scanf("%s", &funcionario[cont].ddd);
                    cont++;       /*faltava isso aqui*/
                    printf("Quer Cadastrar Outro S/N ");
                    fflush(stdin);
                    scanf("%c",&ch);
                }while(ch=='s');
                system("cls");
                printf("\tUSUÁRIO: %s\n"
                "\tCADASTRADO COM SUCESSO\n"
                "\tPRESSIONE ENTER PARA VOLTAR AO MENU", funcionario[cont].nome);
                getchar();getch();
                break;
            case 2:
                for(i=0;i<cont;i++){
                    printf("Nome ----> %s\n",funcionario[i].nome );
                    printf("Email ---> %s\n",funcionario[i].email);
                    printf("DDD -----> %s\n",funcionario[i].ddd  );
                    printf("Tecle Para Continuar");
                    getch();
                }
                break;
        }
    }while(escolha!=3);
    return 0;
}

 

  • Curtir 1
  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!