Cin tamponu nasıl yıkarım?


Yanıtlar:


101

Muhtemelen:

std::cin.ignore(INT_MAX);

Bu okuyacak ve kadar her şeyi görmezden gelecekti EOF. (aynı zamanda okunacak karakter olan ikinci bir argüman da sağlayabilirsiniz (örn: '\n'tek bir satırı yok saymak için).

Ayrıca: std::cin.clear();Akış durumunu sıfırlamak için muhtemelen bundan önce de bir: yapmak istiyorsunuz .


10
(Eski biliyorum.) Önceden temizleyin, bunun yerine akış, tamponunda çalışabileceği iyi bir duruma getirilir.
GManNickG

Teşekkürler GMan! Önce yanlış şekilde yaptım ve hatamı aramak için epey zaman harcadım.
balu

@GManNickG, cevabı düzeltti.
bwDraco

@DragonLord: Geriye dönüp baktığımda yapmam gereken bariz bir çözüm, teşekkürler. :)
GManNickG

3
Sadece benim durumum için "\ n" yi gerekli bulduğumu belirtmek istedim. Aksi takdirde sonraki "cin >>" çalışmaz.
Cardin

114

C sürümleri yerine C ++ boyut kısıtlamalarını tercih ederim:

// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())

// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

15
Daha da önemlisi, değerler farklı olabilir! (akış boyutunun int olması gerekmez)

2
Lütfen dosyanın sonuna kadar göz ardı etmemiz gereken bir örnek verebilir misiniz, çünkü arabelleği cintemizlemek için yukarıdaki ilk ifadeyi kullanır ve kullanırsam, tuşuna basarak cingirene kadar girdi sormaya devam eder ? EOFctrl+d
ajay

@ajay: Hayır. Bu karar vermen gereken bir şey. Ben sadece yukarıdakilerin ne yapacağını açıklıyorum.
Martin York

23
cin.clear();
fflush(stdin);

Konsoldan okurken benim için çalışan tek şey buydu. Diğer her durumda, \ n eksikliğinden dolayı süresiz olarak okunur veya arabellekte bir şey kalır.

DÜZENLEME: Önceki çözümün işleri daha da kötüleştirdiğini öğrendim. Ancak BU, işe yarar:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

13

Buna iki çözüm buldum.

İlki ve en basit olanı, std::getline()örneğin kullanmaktır :

std::getline(std::cin, yourString);

... bu, yeni bir satıra geldiğinde giriş akışını atacaktır. Bu işlev hakkında daha fazla bilgiyi buradan okuyun .

Akışı doğrudan atan bir başka seçenek de bu ...

#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

İyi şanslar!


9
int i;
  cout << "Please enter an integer value: ";

  // cin >> i; leaves '\n' among possible other junk in the buffer. 
  // '\n' also happens to be the default delim character for getline() below.
  cin >> i; 
  if (cin.fail()) 
  {
    cout << "\ncin failed - substituting: i=1;\n\n";
    i = 1;
  }
  cin.clear(); cin.ignore(INT_MAX,'\n'); 

  cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";

  string myString;
  cout << "What's your full name? (spaces inclded) \n";
  getline (cin, myString);
  cout << "\nHello '" << myString << "'.\n\n\n";


4

Tercih ederim:

cin.clear();
fflush(stdin);

Cin.ignore'un kesmediği bir örnek var, ancak şu anda düşünemiyorum. (Mingw ile) kullanmam gerektiğinde bir süre önceydi.

Bununla birlikte, fflush (stdin), standarda göre tanımsız bir davranıştır. fflush () yalnızca çıktı akışları içindir. fflush (stdin), yalnızca Windows'ta beklendiği gibi (en azından GCC ve MS derleyicileriyle) C standardının bir uzantısı olarak çalışıyor gibi görünüyor .

Yani, onu kullanırsanız, kodunuz taşınabilir olmayacak.

Bkz . Fflush (stdin) kullanma .

Ayrıca, alternatif için http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 adresine bakın .


9
fflush (stdin'i); Tanımlanmamış Davranış (C programlama dilinde), 7.18.5.2/2
Cubbi

1
Geçerli, çalışan bir kludge sağlamak için +1. Bazı insanların işleri vardır, diğerlerinin standartları vardır.
Mikhail

5
@Mikhail: İşiniz standart uyumlu kod yazmayı içermelidir. Gelecekte yazdığınız hiçbir şeyi kullanmaktan kaçınacağımdan emin olacağım.
Ed S.

4

Başka bir olası (manuel) çözüm ise

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

CLion ile fflush veya cin.flush () kullanamıyorum, bu yüzden bu kullanışlı oldu.


benim için sonsuz döngü.
StarWind0

Yalnızca satırın sonu, aksi takdirde sonsuz döngü varsa çalışır
Bobul Mentol

2

En kolay yol:

cin.seekg(0,ios::end);
cin.clear();

Sadece cin işaretçisini stdin akışının sonunda konumlandırır ve cin.clear (), EOF bayrağı gibi tüm hata bayraklarını temizler.


1

Aşağıdakiler çalışmalıdır:

cin.flush();

Bazı sistemlerde mevcut değildir ve ardından şunları kullanabilirsiniz:

cin.ignore(INT_MAX);

1
Okunan INT_MAX karakterlerini EOF'ye (ikinci parametrenin varsayılan değeri) ulaşana kadar görmezden gelebileceğinizi söyleyebildiğinizde neden manuel olarak bir döngü yazın.
Evan Teran

Gunnar, her ihtimale karşı yayınınızı bunu yansıtacak şekilde düzenlemeniz daha iyi olabilir.
Dana the Sane

1
Anladığım kadarıyla, flushyöntem yalnızca çıktı içindir ve önceden yazılmış karakterlerle ilgilenir.
Marc van Leeuwen

cin.flush ():basic_istream<char>' has no member named 'flush'
eric

1
#include <stdio_ext.h>

ve sonra işlevi kullan

__fpurge(stdin)

0

cin.get() tuhaf bir şekilde otomatik olarak temizliyor gibi görünüyor (bu kafa karıştırıcı ve muhtemelen huysuz olduğu için muhtemelen tercih edilmiyor).


0

Benim için çalıştı. Getline () ile for döngüsü kullandım.

cin.ignore()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.