Arkadaşlar
#include <iostream>
using namespace std;
int main()
{ int num;
bool a =true;
while (a==true){
cout << "type a number>";
cin>>num;
for(int i=0; i<num;i++){
cout<<"hey"<<endl;
}
}
return 0;
}
Bu program çalıştığında girdiye değer olarak float bir tip (2.0 veya 2.)girdigimde değişik sonuçlar alıyorum mesela:
type a number>type a number>type a number>type a number>type a number>type a number>type a number>type a number>type a number>type a number>type a number>type a number>...
Bunun sebebi nedir
Bunun için std::cin
'in çalışma mekanizmasını anlamak gerek:
-
>>
operatörü sonrası kullanıcı bir veri girdiğinde, bu veri bir buffer
'a aktarılıyor. Mesela 12.4
girip enter’a bastık, buffer’a 12.4\n
yazılıyor.
-
std::cin
bu buffer’a bakıyor:
-
Eğer buffer boşsa veya sadece whitespace
'den oluşuyorsa (yani " "
, "\t"
, "\n"
gibi), kullanıcı input girmesi için bekleniyor. Program başında buffer’ı boş olarak düşünebiliriz.
-
Eğer buffer doluysa belirtilen değişkene (num
oluyor sizdeki karşılığı), buffer’dan aktarabildiği kadar veriyi aktarıyor. Aktarma yapamadığı elemanlar buffer’da kalmaya devam ediyor. Bu durumda 12.4
girip enter’a basarsak, num
(int olduğu için) değişkenine 12
atanıyor, buffer’da ise .4\n
kalıyor.
-
Eğer buffer’daki veri eldeki değişkene aktarılamayacak gibiyse, değişkene:
- C++11 öncesi ise, değişkenin değeri değişmiyor (yani
num
12 olarak kalır)
- C++11 ve sonrası ise, değişkene 0 atanıyor (yani
num
0 oluyor)
Şimdi sizin soruya bu mekanizmayı uygularsak:
- Başta buffer “boş”,
std::cin
kullanıcıdan input bekler.
- Biz
2.
girip enter’a basarız.
- Buffer’da şu an
2.\n
var.
-
std::cin
, bir int
olan num
'a en fazla 2
yi atayabilir.
- Şu an
num
'da 2
değeri var, buffer’da .\n
-
for
çalışır, 2 kere döner hey
felan yazılır.
- Tekrar
while
'ın başına döndük.
-
std::cin
önce buffer’a bakıyor boş mu dolu mu diye.
- Buffer “dolu” ve
.\n
var, kullanıcıdan istemeye gerek yok; ama int
'e dönüştüremiyor buffer’daki değeri.
- Dolayısıyla, (C++ versiyonuna göre)
num
ya 2
olarak devam ediyor, ya da 0
oluyor.
-
for
döngüsü num
'a göre (0 veya 2 kere) dönmeye devam eder.
- 7.adıma gidilir.
Sizdeki çıktıdan C++ versiyonunuzun C++11 veya üzeri olduğu anlaşılıyor çünkü hiç hey
yazmamış, demek ki for
0 kere dönmüş.
Kaynaklar:
https://www.learncpp.com/cpp-tutorial/5-10-stdcin-extraction-and-dealing-with-invalid-text-input/
https://stackoverflow.com/a/13379073/9332187
2 Beğeni
Çok saolun da Buffer ne demek olayı anladım gibi ama Buffer ne yani o veriden arta kalan verimi
Veya o verinin kaydedildiği yer mi?
Daha ziyade böyle evet. Geçici verilerin tutulduğu bir hafıza parçası gibi düşünebiliriz.
2 Beğeni
@Then_Shiffman Anladım yani cin bakıyor elde veri varmı varsa kullanıcıdan input beklemiyor elindeki veriyi kullanıyor saolun.