Ir ao conteúdo

Pq o DEV esta "pulando" o comando GETS(); ?


Renan.mmerlo

Posts recomendados

Postado

Pessoal estou tentando fazer um programa, porém me parece que o DEV esta "pulando" o comando gets()...

Quando chega nessa parte ele nao pede para q a string seja digitada e vai para outro Item.

Help]

 #include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
main()
{


int numero,telefone;
char nome[50],endereco[50],temp_nome[50],temp_endereco[50];

printf("--------------------------");
printf("CADASTRAMENTO DE CLIENTES");
printf("--------------------------");

printf("\n\n\Cl. Numero:");
scanf("%d",&numero);

printf("\n\nNome:");
gets(nome);//Por que esta "pulando" este comando?//

printf("\n\nTelefone:");
scanf("%d",&telefone);

printf("\n\nEndereco:");
gets(endereco);//Por que esta "pulando" este comando?//

system("cls");
printf("--------------------------");
printf("CLIENTE CADASTRADO");
printf("--------------------------");

system("cls");

printf("\n\n%d",numero);
printf("\n\n%s",nome);
printf("\n\n%d",telefone);
printf("\n\n%s",endereco);

getch();
}

Abraçoo

Postado

Problema encontrado:

deve-se utilizar o comando fflush(stdin)

para que o buffer do teclado que armazenava dados "perdidos"

interferia na hora de receber os dados.Quando o buffer ("lixo") ficava armazenado o programa entendia como um entrada do teclado, por isso ele passava diretamente sem que você pudesse digitar.

ps.: Utiliza-se o fflush(stdin) antes da entrada do teclado.

exe.:

fflush(stdin); // Limpa o buffer do teclado                    
printf("\n\nNome:"); // printf normal
gets(temp_nome);// Pega uma string completa incluindo os espaços digitados como em nomes.

Postado

basicamente a funçã gets le o "enter" quando você aperta para confirmar os dados digitados. tente usar dois gets

printf("\n\nNome:");

gets(nome);

gets(nome);

ou então use a função scanf

printf("\n\nNome:");

scanf("%s",nome);

Postado

Tente isso também:

scanf("%d%*c",&numero);

O %*c diz ao scanf pra ignorar qualquer caractere que vem depois de numero.

Mas lembre-se que a função gets é uma função obsoleta. Ela só existe hoje em dia por causa de compatibilidade com códigos antigos. Sempre que puder use o fgets:

fgets(nome, 50, stdin);

//50 é o tamanho do nome[50], stdin é a entrada do teclado.

Postado
Tente isso também:

scanf("%d%*c",&numero);

O %*c diz ao scanf pra ignorar qualquer caractere que vem depois de numero.

Mas lembre-se que a função gets é uma função obsoleta. Ela só existe hoje em dia por causa de compatibilidade com códigos antigos. Sempre que puder use o fgets:

fgets(nome, 50, stdin);

//50 é o tamanho do nome[50], stdin é a entrada do teclado.

Pesquisei sobre esta funçao, e pelo que eu li, ela "aceita" receber o \n quando é pressionado a tecla enter, portanto, seu fosse digitar um nome como teria que fazer? pois ao ser dado enter ela continuaria a receber?

Se alguem estiver um tópico ou algum artigo sobre esta função por favor me indiquem.

Obrigado.

Postado
Pesquisei sobre esta funçao, e pelo que eu li, ela "aceita" receber o \n quando é pressionado a tecla enter, portanto, seu fosse digitar um nome como teria que fazer? pois ao ser dado enter ela continuaria a receber?

Se alguem estiver um tópico ou algum artigo sobre esta função por favor me indiquem.

Obrigado.

Eu acabei de testar ela aqui... é exatamente igual a gets(), quando recebe o enter ela termina.

O motivo principal de usar ela em relação ao gets, é por segurança. Inclusive, em alguns compiladores mais recentes, se você usar o gets, aparece um aviso dizendo que é uma função obsoleta.

Você tem uma string de tamanho 5, nome[5], daí você pede pro usuário digitar o nome dele, mas o nome dele acaba sendo maior que 5 e trava o teu programa (no melhor caso!... no pior caso pode acabar sobrescrevendo alguma área da memória).

Enquanto que usando o fgets(nome, 5, stdin), você tem a segurança de que só vai ler mesmo os 5 caracteres, mesmo que o usuário digite mais.

Lembre-se: nunca confie no usuário, heheh

Postado
Eu acabei de testar ela aqui... é exatamente igual a gets(), quando recebe o enter ela termina.

O motivo principal de usar ela em relação ao gets, é por segurança. Inclusive, em alguns compiladores mais recentes, se você usar o gets, aparece um aviso dizendo que é uma função obsoleta.

Você tem uma string de tamanho 5, nome[5], daí você pede pro usuário digitar o nome dele, mas o nome dele acaba sendo maior que 5 e trava o teu programa (no melhor caso!... no pior caso pode acabar sobrescrevendo alguma área da memória).

Enquanto que usando o fgets(nome, 5, stdin), você tem a segurança de que só vai ler mesmo os 5 caracteres, mesmo que o usuário digite mais.

Lembre-se: nunca confie no usuário, heheh

hummmm, entendi Lunik,

passarei a utiliza-la desde então.

=P

Obrigado

  • Membro VIP
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!