سلام
تابع cin.get چندین نحوه استفاده داره
اگه به این صورت استفاده بشه
cin.get()
یعنی می خواهیم یک کاراکتر را دریافت کنیم
اما این تابع لازم داره که حتما enter زده بشه تا به کار خودش خاتمه بده
اما getch یک کاراکتر از کاراکترهای موجود در بافر کیبورد را می خونه و بر می گردونه
بنابراین اگر بافر کنسول پر باشه ( یعنی حداقل یک کاراکتر داخلش باشه) تابع getch اصلا منتظر نمی مونه تا ما صفحه کلید را فشار بدیم و کاراکتر موجود در بافر را خوانده و بر می گردونه
اگر بافر خالی باشه منتظر می مونه که یک کلید فشار داده بشه به محض فشار داده شدن کلید تابع مقدار را بر می گردونه و enter هم لازم نداره
در چه صورت بافر کنسول می تونه پر باشه؟
درصورتی که ما مثلا در مرحله ای از اجرا برنامه روی دکمه های صفحه کلید فشار بدیم و مثلا برنامه در همون زمان در حالت انجام یک عملیات دیگه باشه یا در حالت sleep باشه
بعدا که getch صدا زده می شه با بافر پر مواجه میشه
که getch هم لازمه همراه با kbhit برای بررسی پر بودن بافر مورد استفاده قرار بگیره
اما cin یه ساختار پیچیده تر داره.خود cin در واقع یک stream هست. داخل cin یه چیزی وجود داره به نام streambuf که در واقع بافر cin محسوب میشه که این بافر با بافر کیبورد مربوط به getch متفاوته
یعنی مثلا وقتی برنامه در حال sleep یا یک عملیات محاسباتی باشه و من در همون لحظه روی صفحه کلید چند دکمه را فشار بدم، چیزی در بافر cin قرار نمی گیره. تنها وقتی عملیات ورودی بخواهیم انجام بدیم مثل get یا getline یا <<cin و مثل اینها انجام بدیم بافر cin به کار گرفته می شه.
گاهی وقتها هنگام ورودی تعداد کاراکترهایی که وارد می کنیم بیشتر از اون مقداری هست که برای گرفتن و تبدیل ورودی لازمه در این حالت cin کاراکترهای اضافی را در بافر خودش نگه می داره که این باعث می شه عملیات های دیگه با اشکال مواجه بشه مثل مثال زیر که می خواهیم یک int دریافت کنیم همیشه یک کاراکتر newline در بافر باقی می مونه
int a;
cin >> a;
یا در این مثال:
char ch[20]={};
cin.getline(ch, 5);
اینجا حداکثر تا 5 کاراکتر دریافت می کنه و اگه بیشتر وارد کردیم در نهایت ch یک رشته 5 حرفی خواهد بود و مابقی کلمات در بافر cin باقی می مونند
برای رفع این مشکل می شه از دستور زیر استفاده کرد
int numchar = cin.rdbuf()->in_avail();
if(numchar > 0 )
cin.ignore(numchar);
اما گاهی اوقات ورودی اشتباه وارد می کنیم مثلا وقتی که در مثال اولی لازمه عدد وارد کنیم به جای اون کاراکتر وارد کنیم در اینجا یه سری flag داخل cin هست که تغییر می کنه که نشون دهنده اینه که cin دچار ارور شده که ما لازمه این flag ها را پاک کنیم که از روش زیر استفاده می کنیم
cin.clear();
خلاصه کارکردن با کنسول این دردسر ها را هم داره که باید این موارد را در نظر گرفت