C++ float sayı ile for döngüsü sorunu

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:

  1. >> 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.

  2. 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.

  3. 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:

  1. Başta buffer “boş”, std::cin kullanıcıdan input bekler.
  2. Biz 2. girip enter’a basarız.
  3. Buffer’da şu an 2.\n var.
  4. std::cin, bir int olan num'a en fazla 2yi atayabilir.
  5. Şu an num'da 2 değeri var, buffer’da .\n
  6. for çalışır, 2 kere döner hey felan yazılır.
  7. Tekrar while'ın başına döndük.
  8. std::cin önce buffer’a bakıyor boş mu dolu mu diye.
  9. Buffer “dolu” ve .\n var, kullanıcıdan istemeye gerek yok; ama int'e dönüştüremiyor buffer’daki değeri.
  10. Dolayısıyla, (C++ versiyonuna göre) num ya 2 olarak devam ediyor, ya da 0 oluyor.
  11. for döngüsü num'a göre (0 veya 2 kere) dönmeye devam eder.
  12. 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.