C ++ 'da cin arabelleğini nasıl temizlerim?
C ++ 'da cin arabelleğini nasıl temizlerim?
Yanıtlar:
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 .
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')
cin
temizlemek için yukarıdaki ilk ifadeyi kullanır ve kullanırsam, tuşuna basarak cin
girene kadar girdi sormaya devam eder ? EOF
ctrl+d
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');
}
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!
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";
Peki ya:
cin.ignore(cin.rdbuf()->in_avail());
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 .
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.
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.
Aşağıdakiler çalışmalıdır:
cin.flush();
Bazı sistemlerde mevcut değildir ve ardından şunları kullanabilirsiniz:
cin.ignore(INT_MAX);
flush
yöntem yalnızca çıktı içindir ve önceden yazılmış karakterlerle ilgilenir.
basic_istream<char>' has no member named 'flush'
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).
Benim için çalıştı. Getline () ile for döngüsü kullandım.
cin.ignore()