Pergunta sobre c++, iostream – A diferença entre cin.ignore e cin.sync

9

Qual é a diferença entrecin.ignore ecin.sync ?

Sua resposta

1   a resposta
14

cin.ignore descarta os caracteres, até o número especificado, ou até que o delimitador seja alcançado (se incluído). Se você chamá-lo sem argumentos, ele descartará um caractere do buffer de entrada.

Por exemplo,cin.ignore (80, '\n') ignoraria 80 caracteres ou tantos quantos forem encontrados até atingir uma nova linha.

cin.sync descarta todos os caracteres não lidos do buffer de entrada. No entanto, não é garantido que isso seja feito em cada implementação. Assim sendo,ignore é uma escolha melhor se você quiser consistência.

cin.sync() apenas limparia o que sobrou. O único uso que posso pensarsync() isso não pode ser feito comignore é um substituto parasystem ("PAUSE");:

cin.sync(); //discard unread characters (0 if none)
cin.get(); //wait for input

Comcin.ignore() ecin.get(), isso poderia ser um pouco de mistura:

cin.ignore (std::numeric_limits<std::streamsize>::max(),'\n'); //wait for newline
//cin.get()

Se houvesse uma nova linha sobrando, apenas colocandoignore parece que vai pulá-lo. No entanto, colocar ambos irá esperar por duas entradas se não houver nova linha. Descartar qualquer coisa que não seja lida resolve esse problema, mas, novamente, não é consistente.

@Rajesh, Isso é realmente adequado para uma nova pergunta, em vez dos comentários de uma pergunta de seis anos de idade. chris
@ 5fox: Eu posso mostrar implementações onde ele não faz nada:ideone.com/AR8lB Benjamin Lindley
ignore () deve ser chamado antes de cin ou depois de cin? Para ser específico, pela primeira vez, quando eu vou para cin, eu preciso liberar dados indesejados no buffer, se houver algum? Ou irá programar o flush quando o main for digitado? Mas o que eu notei é que, se chamarmos de ignore (), ele espera por algum caractere de espaço não branco pela primeira vez. Rajesh
@chris Thaks pela informação. Por que meu código abaixo não aceita string? No caso da string vazia ser inserida, eu quero que o loop while solicite ao usuário uma nova string. O código não funciona para uma string vazia ou para uma string válida. ignore () linhas está me incomodando parece e se eu remover ignore (), as coisas funcionam. Mas estou preocupado se isso pode causar problemas mais tarde, já que eu não estou liberando o buffer. void getString (string & str) {do {cout << "Digite a Cadeia:"; getline (std :: cin, str); cin.ignore (std :: numeric_limits <std :: streamsize> :: max (), '\ n'); } while (str.empty ()); } Rajesh

Perguntas relacionadas