Programa considerar apenas o primeiro caracter

1. Programa considerar apenas o primeiro caracter

Murilo Góes de Almeida
murilogoes

(usa Linux Mint)

Enviado em 03/11/2015 - 19:32h

Boa noite pessoal, gostaria de saber se há alguma possibilidade do sistema considerar apenas o primeiro caractere digitado e descartar o resto. Por exemplo, olhem esse código que eu estou postando abaixo. Se eu digitar na primeira entrada um texto grande, tipo "teste", o programa ja vai atribuir os 5 caracteres nas proximas posições dos vetores. Teria como ele considerar somente o primeiro caractere e eliminar o resto que foi digitado acidentalmente?

#include <iostream>

using namespace std;


int main()
{
char teste[4];

for (int k=0; k!=5; k++)
{
cin >> teste[k];
}

for (int k1=0; k1!=5; k1++)
{
cout << endl << teste[k1] << endl;
}
return 0;
}


  


2. Re: Programa considerar apenas o primeiro caracter

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 03/11/2015 - 20:41h


Se declarar apenas como char e não um array de char, ele considera apenas a primeira letra digitada:

char teste;


3. Re: Programa considerar apenas o primeiro caracter

Murilo Góes de Almeida
murilogoes

(usa Linux Mint)

Enviado em 04/11/2015 - 00:22h

luisrcs escreveu:


Se declarar apenas como char e não um array de char, ele considera apenas a primeira letra digitada:

char teste;


Mas eu preciso do array, estou montando um questionario de 10 perguntas com 4 alternativas (a,b,c,d) cada. Acontece que se na primeira resposta eu digitar aaaaaaaaaa ele já atribui como resposta a todas as perguntas!




4. Re: Programa considerar apenas o primeiro caracter

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/11/2015 - 00:41h

Leia sobre std::istream::ignore() (por exemplo, em http://www.cplusplus.com/reference/).


5. Re: Programa considerar apenas o primeiro caracter

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 04/11/2015 - 22:27h

char letra = teste[0];

Atribui o primeiro caracter à variável letra.


6. Re: Programa considerar apenas o primeiro caracter

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/11/2015 - 13:42h

Luis,

Acho que o ponto dele não é como ler apenas um caráter, pois isso já está funcionado. A questão era como fazer para desconsiderar coisas extras na entrada, sem as acumular para uma próxima leitura.


7. Re: Programa considerar apenas o primeiro caracter

Murilo Góes de Almeida
murilogoes

(usa Linux Mint)

Enviado em 05/11/2015 - 17:07h

Eu usei o fflush para limpar o buffer do teclado e funcionou. Sei que não é o recomendado, mas resolveu o problema por enquanto

Obrigado!


8. Re: Programa considerar apenas o primeiro caracter

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/11/2015 - 18:16h

Realmente fflush() não é recomendado. Além de não ter garantia alguma de que vá funcionar, você ainda mistura I/O em C++ com I/O em C (o que não chega a ser um erro, mas é feio).

Você poderia ter dado atenção a minha sugestão de ler sobre std::istream::ignore(). A seguinte solução é correta, elegante, e você nunca terá dúvidas de se vai funcionar ou não.

cin.ignore(numeric_limits<streamsize>::max(), '\n'); 


Se você achar que isso dá muito trabalho de digitar, pode sempre criar uma função inline ou macro para envelopá-la.

// Definição
inline istream &kill_eol(istream &is){ return is.ignore(numeric_limits<streamsize>::max(), '\n'); }


// Uso
kill_eol(cin);



9. Re: Programa considerar apenas o primeiro caracter

Murilo Góes de Almeida
murilogoes

(usa Linux Mint)

Enviado em 06/11/2015 - 19:56h

paulo1205 escreveu:

Realmente fflush() não é recomendado. Além de não ter garantia alguma de que vá funcionar, você ainda mistura I/O em C++ com I/O em C (o que não chega a ser um erro, mas é feio).

Você poderia ter dado atenção a minha sugestão de ler sobre std::istream::ignore(). A seguinte solução é correta, elegante, e você nunca terá dúvidas de se vai funcionar ou não.

cin.ignore(numeric_limits<streamsize>::max(), '\n'); 


Se você achar que isso dá muito trabalho de digitar, pode sempre criar uma função inline ou macro para envelopá-la.

// Definição
inline istream &kill_eol(istream &is){ return is.ignore(numeric_limits<streamsize>::max(), '\n'); }


// Uso
kill_eol(cin);




Então Paulo, eu até tentei usar o cin.ignore, mas não deu certo. Se eu deixo sem argumentos ele ignora apenas 1 caractere. Se eu coloco um valor tipo 256, não consigo dar entrada no próximo valor do vetor :|


10. Re: Programa considerar apenas o primeiro caracter

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/11/2015 - 01:16h

Você não está usando com um argumento só, está? Note que nos exemplos, eu mostrei com dois argumentos, como deve ser no seu caso.