Ir ao conteúdo
  • Cadastre-se

C++ Cin pulando a entrada de dados


LuizHenrique.
Ir à solução Resolvido por vangodp,

Posts recomendados

Olá. Gostara de saber  o por que quando eu uso espaços, o cin pula a entrada de dados, por exemplo, se eu digitar "Luiz Henrique" ele não pede o cpf, ele pula logo para a idade.

 

#include <iostream>

using namespace std;

struct pessoa
{
    /* data */
    string nome;
    string cpf;

    int idade;


};

int main(int argc, char const *argv[])
{
    pessoa pessoa;

    cout << "Digite seu nome: "<< endl;
    cin >> pessoa.nome;
    cout << "Agora digite seu CPF: "<< endl;
    cin >> pessoa.cpf;
    cout << "Agora digite sua idade: " << endl;
    cin >> pessoa.idade;

    cout << "---------------------------\n";
    cout << "                Seus dados\n"<<endl;
    printf("Seu nome: %s\n", pessoa.nome.c_str());
    printf("Seu cpf: %s\n", pessoa.cpf.c_str());
    printf("Sua idade: %d\n", pessoa.idade);
    cout << "---------------------------";

    system("pause");

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • Solução

o cin tem a "má" costume de ler até encontrar um espaço(' '), o enter('\n') ou um tabulador('\t') isso faz com que cin deixe de ler imediatamente, ou seja se você tiver uma string e tentar ler um nome junto com sobrenome por exemplo, certamente ele só vai liberar o nome para a variavel.

Vou tentar explicar melhor....
Quando você tiver...
string nome;

...e tentar ler "Luiz Henrique"...
cin>>"Luiz Henrique";

...você vai digitar "Luiz Henrique" e apertar o enter para informar que terminou de digitar, saiba que no buffer você tem a seguinte string "Luiz Henrique\n" que basicamente é composto por isso-> Luiz+espaço+Henrique+enter(Luiz+' '+Henrique+'\n') Quando o programa detectar que o \n(Enter) entrou no buffer automaticamente começa a "descarregar" os dados para as variáveis que você criou. O problema é que será liberado os dados em "pedaços" separados pelos 3 caracteres que citei lá no começo, ou seja, o espaço(' '), o enter('\n') ou o tabulador('\t'). Então será liberado "Luiz" para a variável nome porque logo depois ven um espaço, o resto permanecerá no buffer esperando outras variáveis para ser descarregadas, e olha que sorte... logo depois vem o cpf. XD Adivinha o que vai parar no cpf...
Screenshot_1.thumb.jpg.6cf741252a47b65af96ca543af145838.jpg

Rode ele ai no seu computador e comprove:
 

#include <iostream>
using namespace std;

int main () {
    string nome;
    string cpf;
    cout << "Digite \"Luiz Henrique\" e aperte o enter normalmente: ";
    cin >> nome;
    cin >> cpf; //<-vai pular e cpf vai guardar henrique XD
    cout << "No nome tem: " << nome << endl;  //vai imprimir só Luiz
    cout << "E no cpf acredito que tem Henrique verdade?: " << cpf << endl; //E o Henrique vai estar aqui!!!
    

	
    return 0;
}

Agora que entendeu mais ou menos qual o problema, ou pode que não shuehsuesuhe, que se pode fazer? Para ler linhas inteiras você pode usar o getline(cin, nome);
Screenshot_2.thumb.jpg.ef881f3c482445622e0a81ddbc80b433.jpg

 

Então a resposta é, use o getline para ler frases que contenham espaços(strings com espaços)... e cin para palavras simples(strings que contenham somente 1 única palavra sem espaços nem tabuladores), dados básicos como int, float ou char, etc.

 

Se continuar com duvidas pergunte.

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

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