Ir ao conteúdo
  • Cadastre-se

Limpar buffer em C++


Posts recomendados

#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 2
Link para o comentário
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 3
Link para o comentário
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 2
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!