Erro no codigo em c++ alguem pode me ajudar ? [RESOLVIDO]

1. Erro no codigo em c++ alguem pode me ajudar ? [RESOLVIDO]

Rafael santana de jesus
chidori19

(usa Ubuntu)

Enviado em 01/05/2015 - 05:39h

Estou começando a estudar c++ e me deparei com um problema

ele executa normal.
só que da erro eu não consigo entra com o segundo nome

a saida ta assim

exemplo
digite seu nome: Rafael
digite sua nota: 10
aluno: Rafael nota 10

digite seu nome:
digite sua nota:10
aluno: nota 10

o codigo e esse aqui

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdio_ext.h>

using namespace std;


int main()
{

struct TipoAluno{
int Nota;
char Nome[30];
};

struct TipoAluno Alunos[2];


cout<<"\nDigite seu nome ";
cin.getline(Alunos[0].Nome,30);
__fpurge(stdin);

cout<<"\nDigite sua nota ";
cin>>Alunos[0].Nota;
cout<<"Aluno: " << Alunos[0].Nome<<" "<<"Nota " <<Alunos[0].Nota<<"\n";

cout<<"\nDigite seu nome ";
cin.getline(Alunos[1].Nome,30);
__fpurge(stdin);

cout<<"\nDigite sua nota ";
cin>>Alunos[1].Nota;
cout<<"Aluno: " << Alunos[1].Nome<<" "<<"Nota " <<Alunos[1].Nota<<" \n";

return 0;
}





  


2. Re: Erro no codigo em c++ alguem pode me ajudar ?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/05/2015 - 10:13h

A causa do problema é que, após ler o valor numérico com o operador >>, o sinal de fim de linha ('\n') não é consumido, e acaba sendo lido pelo getline seguinte, como se fosse uma linha vazia. Você tentou tratar isso usando __fpurge(), mas aparentemente std::cin e stdin não estão compartilhando exatamente os mesmos dados (i.e. o '\n' já deve estar no buffer de std::cin, e não mais no de stdin).

Em todo caso, não é mesmo prudente misturar E/S ao estilo de C com ao estilo C++ pois, embora haja alguma tentativa de sincronizar as duas, isso não é obrigatório para toda e qualquer implementação, e mesmo aquelas que tentam fazê-lo podem não alcançar um nível perfeito -- como você bem pôde ver neste caso. Por isso, minha sugestão é que você use funções do C++ para administrar o estado da entrada.

Um bom ponto de partida é usar a função membro std::istream::ignore(). Outras possibilidades que me ocorrem são:

1) Fazer e usar uma função específica para descarte, que ao contrário de std::istream::ignore(), não descarte simplesmente todos os caracteres, mas somente espaços em branco que não sejam '\n'. Essa função poderia parecer com o que vai abaixo.

inline istream &ignore_blanks_until_eol(istream &is){
int ch;
while(isspace(ch=is.get()) && ch!='\n')
; // Não faz nada, só repete a leitura enquanto for branco.
if(ch!=EOF && ch!='\n')
is.unget(ch); // Devolve dado para buffer, para próxima leitura.
return is;
}


2) Ler todos os dados com getline(), jogando-s para um buffer de texto, para garantir que '\n' seria sempre consumido. Quando se quiser extrair dados numéricos, pode-se usar std::istringstream ou a função std::stoi() do C++11.

// Usando istringstream (C++98)

#include <sstream>

/* ... */

string line;
int number;
istringstream extractor;

getline(cin line);
extractor.str(line);
if(!(extractor >> number)){
/* Falha na conversão. Toma alguma providência. */
}


// Usando std::stoi() (C++11)
string line;
int number;
size_t bad_char;

getline(cin, line);
number=stoi(line, &bad_char, 10);
if(bad_char<line.length()){
/* Dado mal-formatado. Trata o erro. */
}



3. Re: Erro no codigo em c++ alguem pode me ajudar ? [RESOLVIDO]

Rafael santana de jesus
chidori19

(usa Ubuntu)

Enviado em 03/05/2015 - 16:03h

muito obrigado eu consegui resolver o problema limpando o buffer apos a leitura da nota.


cout<<"\nDigite sua nota ";
cin>>Alunos[0].Nota;
cout<<"Aluno: " << Alunos[0].Nome<<" "<<"Nota " <<Alunos[0].Nota<<"\n";
__fpurge(stdin);






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts