Ir ao conteúdo
  • Cadastre-se
Pedro Henrique Faria Teixe

Limpar buffer em C++

Posts recomendados

Olá Pedro

 

Tente utilizar fflush(stdin)

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Pedro Henrique Faria Teixe manda seu código ai pra gente dar uma olhada!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <iostream>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <stdlib.h>


using namespace std;
int x;
int main()
{

string str;
string s;
int num,pos,tam;
                cin >> num;

        for(int y=0;y<=num;y++){
            getline(cin,str);

            s+=str[0];
            for(int i=0,x=0;i<str.size();i++){
                if(str[i] == ' '){
                    pos=i;
                    s+=str[pos+1];

                }


            }
            cout <<s << endl;
            s = ' ';
        }


return 0;
}
adicionado 1 minuto depois
agora, Pedro Henrique Faria Teixe disse:

#include <iostream>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <stdlib.h>


using namespace std;
int x;
int main()
{

string str;
string s;
int num,pos,tam;
                cin >> num;

        for(int y=0;y<=num;y++){
            getline(cin,str);

            s+=str[0];
            for(int i=0,x=0;i<str.size();i++){
                if(str[i] == ' '){
                    pos=i;
                    s+=str[pos+1];

                }


            }
            cout <<s << endl;
            s = ' ';
        }


return 0;
}

Usa como exemplo essa string aqui para voce entender. "compete online design event rating"

adicionado 5 minutos depois

@Gustavo AndrettoO problema pode estar no final da linha quando eu declaro que a string é igual ao espaco para zerar e ela n concatenar com outra string, porém quando faco sem igualar a espaco também da o mesmo erro

 

adicionado 9 minutos depois

@Gustavo Andretto Conseguir manim, eu usei, s = "", ao invés de s = ' '; e deu certo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro erro. Mas bem não considerar um erro mas sim prever erros.
Na parte:

Citação

for ( int i = 0, x = 0; i < str.size(); i++ )

você está comparando int i com size_t size() const; que é uma espécie de função membro da classe string, e digo espécie de função membro porque sinceramente não sei se pertence a essa classe string ou se ela foi herdada de outras superclasses, coisa que não vem ao caso mas deixo constância.
O compilador gera um aviso ao comparar int com size_t:
Screenshot_1.jpg.21ec5d7e5290c5dbfa1de13c790eeae9.jpg
O size_t é uma definição de novo tipo de um inteiro sem sinal (unsigned int) e ao comparar com int gera o tal warning. warnings não são erros mas podem causar que seu programa funcione de forma errada, mas pode não acontecer e por isso não é tachado de erro se não um simples "Tome cuidado com isso!". Para solucionar o problema você tem 2 vias. A primeira forma é declarar i como unsigned int deixando o for tal como:

Citação

for ( unsigned int i = 0, x = 0; i < str.size(); i++ )

Nesse caso você esta comparando 2 tipos de dados iguais e não vai gerar erro.
A segunda forma de solucionar o problema é você fazer uma conversão de tipo de size_t a int na função "membro" size:

Citação

for ( int i = 0, x = 0; i < (int)str.size(); i++ )

Qualquer das duas opções vai lhe retirar o tal aviso de warning, porém acho mais correto o primeiro nesse

 

Bom...
Passando ao problema principal, o verdadeiro problema que temos é que você nem explicou o que pretende fazer realmente, assim que fica realmente difícil lhe ajudar com seu problema mesmo que tenha postado o seu código. Da a entender que entra com uma ou mais strings e em cada passada o usuário teria uma string como "ola baby lol" e ao parecer você quer gerar uma string sem espaços tipo "olababylol" porém fica difícil lhe ajudar se nunca comunicar o que pretende conseguir, pois somos programadores e não videntes. Espero que não tenha a conta suspendida por moderadores a causa do "videntes" >_<, mas que vou fazer... sou algo rebelde.

Conte o que pretende conseguir e ponha o código tal como tem atualmente. Se o que você quer é somente saber como limpar o buffer saiba que para limpar o buffer só existe uma forma, e é lendo char a char desde o buffer. Uma solução muito usada pela red é essa:
 

void flush() {
    //funçao excelente para limpar o buffer de entrada.
    int ch;
    while ( ( ch = fgetc ( stdin ) ) != EOF && ch != '\n' ) {}
}

basicamente faz o que falei... ler char a char do buffer deixando ele livre. Pode parecer um elefante branco mas é a forma mais recomendada por muitos programadores e ao parecer a mais efetiva e portável. Eu não usaria fflush junto com stdin, pois seu programa passaria a ser uma loteria(pode ter premio >_<) e se tiver sorte pode até funcionar(ou não).

Pegue essa função no seu programa e chame ela cada vez que realizar uma leitura por teclado, após realizar a leitura. Outra coisa que você pode  tentar é sincronizar o buffer com o que você escreveu colocando cin.sync() logo depois de realizar uma leitura. Mas se quiser uma solução mais efetiva conte o que você quer conseguir e lhe tentaremos ajudar.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
12 horas atrás, Jefferson Moreira disse:

scanf (" %d[^/s]", variavel);

 

Ele lê a string guarda e limpa o buffer

Acredito que isso não vai funcionar...

 

O modo que eu achei que gera resultados consistentes foi usar "%*[^\n]" em um scanf e logo em seguida usar "%*c" em outro scanf.

 

Lembrando que no scanf, %[ serve para capturar cadeias de caracteres/string, sendo que você indica um conjunto de caracteres entre os colchetes, ou seja %[0-9a-zA-Z] capturaria uma string contendo números e letras. Você também pode usar ^ no início do conjunto de caracteres para indicar um conjunto de caracteres que não devem ser capturados (ou seja, todos os caracteres que não forem iguais ao que vier após ^ são capturados), por exemplo %[^\n] captura qualquer caractere menos o caractere nova linha '\n'.

 

E * é usado para informar ao scanf que o que for capturado não será guardado em nenhuma variável, ou seja é apenas descartado.

 

Ficando assim:

#include <stdio.h>

void flush(){
    /*Descarta todos os caracteres se houver algum até 
      encontrar o caractare nova linha ´\n´, então só
      sobra o ´\n´ na entrada: */
    scanf("%*[^\n]"); 
    //E então descarta o caractere nova linha ´\n´:
    scanf("%*c");  
}

int main()
{
    int i;
    char c, d, e;
    
    /*Pode ser feito colocando o %*[^\n] dentro do scanf
      de captura: */
    scanf("%d%*[^\n]", &i);
    scanf("%*c");
    
    //Ou usando dois scanfs após capturar para descartar:
    scanf("%c", &c);
    scanf("%*[^\n]");
    scanf("%*c");
    
    /*Então podemos usar isto para criar uma função para
      limpar a stdin: */
    scanf("%c", &d);
    flush();
    
    scanf("%c", &e);
    flush();
    
    printf("\n%d \n%c \n%c \n%c \n", i, c, d, e);
    
    return 0;
} 

 

Só que juntar os 2 num único scanf não funciona:

scanf("%*[^\n]%*c"); //Não funciona p/ limpar a stdin

Pois o caractere nova linha fica sobrando na stdin.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

Aprenda_a_Ler_Resistores_e_Capacitores-capa-3d-newsletter.jpg

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!